Set特点:集合中不允许有重复对象
HashSet:
一个基于HashMap的Set实现。其中,所有的值为“假值”(同一个Object对象,具备和HashMap同样的性能。基于这个特性,这个数据结构会消耗更多不必要的内存。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
PRESENT为HashSet中静态常量,所有HashSet元素的value值都指向一个Object对象。
Set中允许添加null对象。
使用HashSet需要定义元素对象的hashCode()和equals()方法,分别用来生成哈希码和比较对象是否相同。如果不自定义这两个方法,会调用Object的方法,实现如下:
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
hashCode是调用其他语言库实现的,equals方法直接比较两个对象的引用是否是同一个。
向HashSet中添加对象时,会调用这两个方法,只有当两者都相同时才会判断为相同元素。HashSet的存储方式在HashMap中叙述。
由于哈希的存在,HashSet无法保存元素的存入顺序,HashSet也不能对其中的元素进行排序。
Entry(int h, K k, V v, Entry<K,V> n) {
value = v;
next = n;
key = k;
hash = h;
}
值为枚举类型的Set。Java的每一个enum都映射成一个不同的int。这就允许使用BitSet——一个类似的集合结构,其中每一比特都映射成不同的enum。EnumSet有两种实现,RegularEnumSet——由一个单独的long存储(能够存储64个枚举值,99.9%的情况下是够用的),JumboEnumSet——由long[]存储。
BitSet:
一个比特Set。需要时常考虑用BitSet处理一组密集的整数Set(比如从一个预先知道的数字开始的id集合)。这个类用 long[]来存储bit。
LinkedHashSet:
继承了HashSet,这个类基于LinkedHashMap实现。这是唯一一个保持了插入顺序的Set。具体描述见LinkedHashMap。
TreeSet:
这是一个基于TreeMap的实现,这是在单线程部分唯一一个排序的Set。具体描述见TreeMap。
相关链接:Java集合学习--HashMap,HashTable,LinkedHashMap系列