set接口
set接口:无序的,不可重复的
- HashSet:作为set接口的主要实现类;线程不安全,可以存储NUll值
- LinkedHashSet:是HashSet的子类,遍历其内部数据时,按照添加顺序遍历
- TreeSet:可以按照添加对象指定属性进行排序
Set接口中没有额外定义新的方法
HashSet
关于无序性与不可重复性
无序性:
不等于随机性。以HashSet为例,存储数据在底层数组中并非按照数组索引顺序添加,而是按照数据的哈希值决定
不可重复性:
保证添加的元素按照equals()判断时,不能返回true。即:相同的元素只能添加一个。结合添加元素的过程理解
添加元素的过程
向HashSet中添加元素a,首先调用hashCode()方法,计算a的哈希值此哈希值通过某种算法计算出在HashSet底层数组中的存放位置(索引值)判断这个位置是否已经有元素;
- 如果没有,则添加成功
- 如果有其他元素b(或以链表形式存在的多个元素),则比较a与b的哈希值
- 如果哈希值不相同,则元素a添加成功
- 如果哈希值相同,则调用a所在类的equals方法
- 返回true,则a与b相同,添加失败
- 返回false,添加成功
public class SetTest {
public static void main(String[] args) {
Set set = new HashSet();
set.add(456);
set.add(123);
set.add("AA");
set.add("CC");
set.add(new Person("Tom", 12));
set.add(129);
// System.out.println(set);
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
复制代码
LinkedHashSet
- LinkedHashSet作为HashSet的子类, 在添加数据的同时,还维护了两个引用,记录此数据前后两个数据对于频繁地遍历操作,效率更高
- 继承Collection接口中的方法
public class LinkedHashSetTest {
public static void main(String[] args) {
//LinkedHashSet作为HashSet的子类,
// 在添加数据的同时,还维护了两个引用,记录此数据前后两个数据
//对于频繁地遍历操作,效率更高
Set set = new LinkedHashSet();
set.add(456);
set.add(123);
set.add("AA");
set.add("CC");
set.add(new Person("Tom", 12));
set.add(129);
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
复制代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END