Set集合
Set 集合里面存储的是无序的不重复元素,没有索引,可以采用迭代器和增强for来获取元素,Set 常用的子类有 HashSet、LinkedHashSet 集合,可以通过 equals 方法来判断是否为重复元素。
HashSet 集合
HashSet 类实现 Set 接口,由哈希表支持(实际上是一个 HashMap 集合),HashSet 集合不能保证迭代顺序与元素存储顺序相同,采用哈希表结构存储数据结构,保证元素唯一性的方式依赖于:hashCode() 和 equals() 方法。
- 特点:无序集合,存储和取出的顺序不同,没有索引,不存储重复元素
- 在代码编写上和 ArrayList 完全一致
- 存储、取出数据都比较快
- 线程不安全,运行速度快
- 底层数据结构为哈希表(链表数组结合体)
public class demo6 {
public static void main(String[] args) {
Set<String> S = new HashSet<String>();
S.add("abc");
S.add("bcd");
S.add("cde");
S.add("abc"); //不会被添加,因为前面有了 "abc" 这个字符串,而Set不存储重复的元素。
//增强for
for(String s : S) {
System.out.println(s);
}
System.out.println("=====================");
//迭代器
Iterator it = S.iterator();
while(it.hasNext()) {
String s = (String)it.next();
System.out.println(s);
}
}
}
保证元素唯一性的方法
HashSet存储字符串的时候,为什么字符串相同的只存储了一个呢?
通过查看源码,我们知道这个方法底层依赖了两个方法:hashCode()和equals()。
步骤:
- 首先比较哈希值
- 如果相同,继续比较地址值或者走equals() 方法
- 如果不同,直接添加到集合中
add方法的具体步骤:
- 先看hashCode() 值是否相同
- 相同:继续走equals() 方法
- 返回true:说明元素重复,就不添加
- 返回false:说明元素不重复,就添加到集合
- 不同:直接把元素添加到集合
- 相同:继续走equals() 方法
String 类重写了hashCode()和equals()方法,所以它可以把内容相同的字符串去掉,只留下一个。
使用自定义类对象时,一定要重写hashCode()和equals()方法(使用快捷键 alt + shift + s
),否则根本不会进行hashCode()判断!
TreeSet集合
能够对元素按照某种规则进行排序。
排序有两种方式:
- 自然排序
- 比较器排序
public class TreeSetDemo {
public static void main(String[] args) {
//自然顺序排序
TreeSet<Integer> t = new TreeSet<Integer>();
t.add(18);
t.add(1);
t.add(28);
t.add(38);
t.add(28);
t.add(8);
for(Integer i : t) {
System.out.println(i);
}
}
}
打印结果为:
1
8
18
28
38