Set集合特点
无序(存储顺序和取出顺序不一致),唯一
Set set = new HashSet();
// 创建并添加元素
set.add("hello");
set.add("java");
set.add("world");
set.add("java");
set.add("world");
// 增强for
for (String s : set) {
System.out.println(s);
}
HashSet类
概述:
1、不保证set的迭代顺序
2、特别是它不保证该顺序恒久不变
HashSet如何保证元素的唯一性:
1、底层数据结构是哈希表(元素是链表的数组)
2、哈希表依赖于哈希值存储
3、添加功能底层依赖两个方法:
int hashCode()和boolean equals(Object obj)
判断步骤:
先看hashCode()值是否相同
相同:继续走equals()方法
返回true: 说明元素重复,就不添加
返回false:说明元素不重复,就添加到集合
不同:就直接把元素添加到集合
注意:如果类没有重写这两个方法,默认使用的Object()。
而String类重写了hashCode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个。
HashSet集合存储自定义对象时保证元素的唯一性必须重写hashCode()和boolean equals(Object obj)
LinkedHashset类
概述:
1、元素有序唯一
2、由链表保证元素有序(存储和取出是一致)
3、由哈希表保证元素唯一
底层数据结构由哈希表和链表组成。
Treeset类
概述:
1、使用元素的自然顺序对元素进行排序
2、或者根据创建set是提供的Comparable进行排序
3、具体取决于使用的构造方法
Treeset如何保证元素的排序和唯一性:
底层数据结构是红黑树(红黑树是一种自平衡的二叉树)
原理:
1、第一个元素存储的时候,直接作为根节点存储
2、从第二个元素开始,每个元素从根节点开始比较
大:放右边
小:放左边
相等:不管
3、读取:从根节点开始,按照左中右的原则依次取出元素

自然排序:无参构造是自然排序