深入学习java集合:HashSet<E>实现
2016-05-27 21:32
751 查看
1、HashSet类图
HashSet是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。HashSet按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。HashSet具有以下特点:
–不能保证元素的排列顺序
–HashSet不是线程安全的
–集合元素可以使 null
当向 HashSet集合中存入一个元素时,HashSet会调用该对象的 hashCode() 方法来得到该对象的 hashCode值,然后根据 hashCode值决定该对象在 HashSet中的存储位置。如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相等,hashSet将会把它们存储在不同的位置,但依然可以添加成功。
HashSet底层是通过引用HashMap来实现。默认初始化容量16,加载因子0.75。
2、HashSet构造实现以及重要方法
对HashSet而言,其实现是依靠内部关联一个HashMap对象,对HashSet的操作都转为对这个HashMap对象响应对象的操作。添加到Set中的元素作为Map对象的key,,对应的value为一个公用的静态对象PRESENT ,代码中为:
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
1) 构造器
HashSet 提供了5个不同的构造器。
// 默认的无参构造器,实际底层会初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
// 构造一个包含指定collection中的元素的新set。 实际底层使用默认的加载因子0.75和足以包含指定 collection中所有元素的初始容量来创建一个
HashMap。
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
//以指定的initialCapacity和loadFactor构造一个空的HashSet。
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
//以指定的initialCapacity构造一个空的HashSet。
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
2) iterator(): Iterator<E> 遍历Set的迭代器
// 返回对此set中元素进行迭代的迭代器。返回元素的顺序并不是特定的。
//层实际调用底层HashMap的keySet来返回所有的key,由此 可见HashSet中的元素,只是存放在了底层HashMap的key上。
public Iterator<E> iterator() {
return map.keySet().iterator();
}
3) contains(o: Object): boolean 判断Set中是否包含对应的元素
// 如果此set包含指定元素,则返回true。 更确切地讲,当且仅当此set包含一个满足(o==null ? e==null : o.equals(e)) 的e元素时,返回true。
public boolean contains(Object o) {
return map.containsKey(o);
}
4) add(e: E): boolean 向Set中添加元素方法
// 如果此set中尚未包含指定元素,则添加指定元素。 更确切地讲,如果此 set 没有包含满足(e==null ? e2==null : e.equals(e2)) 的元素e2,则向此set 添加指定的元素e。 如果此set已包含该元素,则该调用不更改set并返回false。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
5) remove(o: Object): boolean 将元素从Set中移除的方法
// 如果指定元素存在于此set中,则将其移除。 更确切地讲,如果此set包含一个满足(o==null ? e==null : o.equals(e))的元素e, 则将其移除。如果此set已包含该元素,则返回true (或者:如果此set因调用而发生更改,则返回true)。(一旦调用返回,则此set不再包含该元素)。
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
HashSet是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。HashSet按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。HashSet具有以下特点:
–不能保证元素的排列顺序
–HashSet不是线程安全的
–集合元素可以使 null
当向 HashSet集合中存入一个元素时,HashSet会调用该对象的 hashCode() 方法来得到该对象的 hashCode值,然后根据 hashCode值决定该对象在 HashSet中的存储位置。如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相等,hashSet将会把它们存储在不同的位置,但依然可以添加成功。
HashSet底层是通过引用HashMap来实现。默认初始化容量16,加载因子0.75。
2、HashSet构造实现以及重要方法
对HashSet而言,其实现是依靠内部关联一个HashMap对象,对HashSet的操作都转为对这个HashMap对象响应对象的操作。添加到Set中的元素作为Map对象的key,,对应的value为一个公用的静态对象PRESENT ,代码中为:
private transient HashMap<E,Object> map;
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
1) 构造器
HashSet 提供了5个不同的构造器。
// 默认的无参构造器,实际底层会初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
// 构造一个包含指定collection中的元素的新set。 实际底层使用默认的加载因子0.75和足以包含指定 collection中所有元素的初始容量来创建一个
HashMap。
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}
//以指定的initialCapacity和loadFactor构造一个空的HashSet。
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
//以指定的initialCapacity构造一个空的HashSet。
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
2) iterator(): Iterator<E> 遍历Set的迭代器
// 返回对此set中元素进行迭代的迭代器。返回元素的顺序并不是特定的。
//层实际调用底层HashMap的keySet来返回所有的key,由此 可见HashSet中的元素,只是存放在了底层HashMap的key上。
public Iterator<E> iterator() {
return map.keySet().iterator();
}
3) contains(o: Object): boolean 判断Set中是否包含对应的元素
// 如果此set包含指定元素,则返回true。 更确切地讲,当且仅当此set包含一个满足(o==null ? e==null : o.equals(e)) 的e元素时,返回true。
public boolean contains(Object o) {
return map.containsKey(o);
}
4) add(e: E): boolean 向Set中添加元素方法
// 如果此set中尚未包含指定元素,则添加指定元素。 更确切地讲,如果此 set 没有包含满足(e==null ? e2==null : e.equals(e2)) 的元素e2,则向此set 添加指定的元素e。 如果此set已包含该元素,则该调用不更改set并返回false。
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
5) remove(o: Object): boolean 将元素从Set中移除的方法
// 如果指定元素存在于此set中,则将其移除。 更确切地讲,如果此set包含一个满足(o==null ? e==null : o.equals(e))的元素e, 则将其移除。如果此set已包含该元素,则返回true (或者:如果此set因调用而发生更改,则返回true)。(一旦调用返回,则此set不再包含该元素)。
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
相关文章推荐
- Spring03
- Spring02
- Java IO和Java NIO在文件拷贝上的性能差异分析
- Java基础练习之用数组写一个员工管理系统
- Windows10 在高清屏下显示使用Eclipse字体小解决办法
- 深入学习java集合:LinkedList<E>实现
- 深入学习java集合:ArrayList<E>实现
- Java 之 线程的创建和启动(一)
- Java高效读取大文件
- java静态内部类
- Spring 4.x官方参考文档中文版——第21章 Web MVC框架(7)
- 我来说说java的NIO
- java读取大文件 超大文件的几种方法
- java nio 读取大文件
- 深入学习java集合:JAVA集合类主要接口
- JAVA之NIO按行读取大文件
- java中的泛型
- java 读取txt,java读取大文件
- 第一个spring冲刺心得及感想
- java期末设计(十三周)