set接口:特点不重复元素,没索引
- 一个不包含重复元素的collection
- set没有索引,set集合取出元素的方式可以采用:迭代器、增强for,没索引
- set接口方法和collection完全一样
HashSet: 无序,不重复,没索引
- 和HashMap是一回事
- 是一个无序集合,即存的顺序和储的顺序不一定相同
- 允许存储null元素
public class HashSetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<String>();
set.add("ze");
set.add("qiang");
set.add("qiang");
set.add("liu");
set.add("wang");
Iterator<String> it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
System.out.println("=========================");
for(String s : set) {
System.out.println(s);
}
}
}
输出:
wang
liu
ze
qiang
=========================
wang
liu
ze
qiang
HashSet集合自身特点:
底层数据结构:哈希表(链表数组集合体)
查询、增删速度快
线程不安全,运行速度快
桶的数量越多,迭代速度越慢,如果迭代性能重要,初始容量,也就是数组长度不要设置得太高,默认是16,加载因子意思是达到数组长度XX时,进行扩容,扩到两倍以上,通过复制实现,很耗费,默认0.75。扩容的方法叫做数据的再哈希rehash。一般都使用默认。
LinkedHashSet:
基于链表的哈希实现,双向链表,继承自HashSet,有序存储,线程不安全
实践:
当写一个类要放入set集合时,注意要重写hashCode和equals方法(判断元素是否重复的根本所在),java可以自动写,就像添加get和set方法一样
面试题:
两个对象 p1 p2
问题:
- 若p1.hashCode() == p2.hashCode(),p1.equals(p2)一定是true吗
- p1.equals(p2) == true,两对象哈希值一定相同吗
答案: - 不一定
- 一定
原因:开发文档(hashCode的常规协定)里规定,在对同一对象多次调用hashCode方法时,必须一致地返回相同的整数。
如果两个对象不相等,那么对这两个对象中的任一对象调用hashCode方法不要求一定生成不同的整数结果。