Set容器——HashSet及常用API
2016-04-17 22:36
483 查看
Set容器特点:
① Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序;
② 最常用的两个Set接口的实现类是HashSet和TreeSet;
HashSet及常用API
① HashSet扩展AbstractSet并且实现Set接口;
② HashSet使用散列表(又称哈希表)进行存储;
③ 构造方法:
a) HashSet()
b) HashSet(Collection c)
c) HashSet(int capacity)
d) HashSet(int capacity,float fillRatio)
④ HashSet没有定义任何超过它的父类和接口提供的其它方法;
⑤ 散列集合没有确保其元素的顺序,因为散列处理通常不参与排序;
输出结果:
[李四, 张三, jay, jack]
此处第二个jay没有存入;
可以将其打印出来System.out.println(data.add("jay"));,结果显示第一个为true,第二个为false
编写一个Student类:
主方法中添加及输出
输出结果:
true
true
true
3
由此可见:new Student("张三",20)两次都创建了,若想字相同时只创建一次则需重构hashCode和equals方法
如下:
再次执行,输出结果:
true
true
false
2
总结:HashSet的内部操作的底层数据是HashMap,只是我们操作的是HashMap的key;
① Set容器是一个不包含重复元素的Collection,并且最多包含一个null元素,它和List容器相反,Set容器不能保证其元素的顺序;
② 最常用的两个Set接口的实现类是HashSet和TreeSet;
HashSet及常用API
① HashSet扩展AbstractSet并且实现Set接口;
② HashSet使用散列表(又称哈希表)进行存储;
③ 构造方法:
a) HashSet()
b) HashSet(Collection c)
c) HashSet(int capacity)
d) HashSet(int capacity,float fillRatio)
④ HashSet没有定义任何超过它的父类和接口提供的其它方法;
⑤ 散列集合没有确保其元素的顺序,因为散列处理通常不参与排序;
HashSet<String> data=new HashSet<String>(); data.add("张三"); data.add("李四"); data.add("jay"); data.add("jack"); data.add("jay"); System.out.println(data);
输出结果:
[李四, 张三, jay, jack]
此处第二个jay没有存入;
可以将其打印出来System.out.println(data.add("jay"));,结果显示第一个为true,第二个为false
编写一个Student类:
class Student{ private String name; private int age; public Student(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
主方法中添加及输出
HashSet<Student> stuSet=new HashSet<Student>(); System.out.println(stuSet.add(new Student("张三",20))); System.out.println(stuSet.add(new Student("李四",30))); System.out.println(stuSet.add(new Student("张三",20))); System.out.println(stuSet.size());
输出结果:
true
true
true
3
由此可见:new Student("张三",20)两次都创建了,若想字相同时只创建一次则需重构hashCode和equals方法
如下:
@Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + age; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Student other = (Student) obj; if (age != other.age) return false; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; }
再次执行,输出结果:
true
true
false
2
总结:HashSet的内部操作的底层数据是HashMap,只是我们操作的是HashMap的key;
相关文章推荐
- 每周更新学习进度表--第六周
- c++学习笔记1(指针和引用)
- 2.为什么在写了equals方法之后还要写hashcode方法
- 由路由器设置错误导致无法进入如新浪微博等网站的解决方案
- 请你帮帮小王 (长沙理工大学第十一届程序设计竞赛)
- php打包文件夹代码实现
- java设计模式之观察者模式
- JSP中pageEncoding、charset=UTF-8及request/response
- K-Farm Irrigation|并查集
- iOS 8 自适应 Cell
- 常见linux命令
- Android开发本地及网络Mp3音乐播放器(三)MainActivity(主界面)
- 动态规划—矩阵连乘问题
- Android开发本地及网络Mp3音乐播放器(三)MainActivity(主界面)
- AOP日志,记录调用类、方法、方法参数名称、方法参数值(包括对象和基本类型)
- 剑指offer(十一)之数值的整数次方
- 第七届科技节咨询处 【如果您有任何关于比赛的疑问,我们将在该帖内进行统一答复】
- Linux如何实现开机启动程序详解
- 项目绩效考核体系执行简述
- 常用类和反射总结