您的位置:首页 > 编程语言 > Java开发

Java集合深入学习--HashSet与TreeSet

2015-08-19 16:21 706 查看
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;
}


EnumSet:
值为枚举类型的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系列
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: