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

java源码解读之HashSet------jdk 1.7

2017-04-13 09:41 399 查看
今天来看下HashSet,跟LinkedHashMap一样跟HashMap关系很大,不同的是HashSet不是继承HashMap,而是把HashMap作为一个属性使用。相当于只是使用HashMap的key,所以方法都是围绕操作HashMap来进行。HashSet的内部结构很简单,下面就简单的说明一下。
1. 定义


首先来看看set的接口定义:

//跟list与map接口方法名字左右大抵一致,就不多做介绍了
public interface Set<E> extends Collection<E> {
// Query Operations
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
<T> T[] toArray(T[] a);
// Modification Operations
boolean add(E e);
boolean remove(Object o);
// Bulk Operations
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean retainAll(Collection<?> c);
boolean removeAll(Collection<?> c);
void clear();
// Comparison and hashing
boolean equals(Object o);
int hashCode();
}


现在来看看HashSet的定义:

//AbstractSet实现了set的一部分方法的一个抽象类
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable


2. 属性


//不是使用数组什么的,底层是使用HashMap作为实现
private transient HashMap<E,Object> map;
//因为HashMap存放需要value,所以设置一个静态变量作为值进行存储
private static final Object PRESENT = new Object();


3.构造器


//构造器内部都在操作HashMap
public HashSet() {
map = new HashMap<>();
}
public HashSet(Collection<? extends E> c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
//数据放置在HashMap中,具体代码看下方
addAll(c);
}
public boolean addAll(Collection<? extends E> c) {
//modified如果为true说明put方法调用成功,HashMap中没有重复值
boolean modified = false;
for (E e : c)
if (add(e))
modified = true;
return modified;
}
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public HashSet(int initialCapacity, float loadFactor) {
map = new HashMap<>(initialCapacity, loadFactor);
}
public HashSet(int initialCapacity) {
map = new HashMap<>(initialCapacity);
}
//引用自网上:不对外公开的一个构造方法(默认default修饰),底层构造的是LinkedHashMap,dummy只是一个标示参数,无具体意义
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}


4.解析部分方法源码

4.1 增加方法


//上面已经介绍过,就是调用HashMap的put方法,没什么好说的
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}


4.2 增加方法


//就是调用HashMap的remove方法,没什么好说的
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}


4.3 修改方法

因为set的特性,无重复,所以不需要修改方法,如果不需要直接调用删除方法。

4.4 查找方法

因为Set的特性,无序,没有提供get方法

4.5 迭代器


//还是调用HashMap中key的迭代器来实现方法
public Iterator<E> iterator() {
return map.keySet().iterator();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: