Java JDK7源码-java.util.AbstractSet<E>

源码

1
package java.util;
2
3
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {
4
5
    protected AbstractSet() {
6
    }
7
8
    /**
9
     * 重写父类:java.util.AbstractCollection<E>
10
     * 实现接口:java.util.Set<E>
11
     * 
12
     * 比较o与set的相等性。
13
     * 满足如下条件返回true:
14
     * o同样是一个Set
15
     * o与set长度相同
16
     * o中的每个元素都在set中存在
17
     * 只要满足这些条件,即便是Set接口的不同实现之间也可判定为相等
18
     * 
19
     * 本方法首先检查o是否是set本身,如果是则返回true。
20
     * 然后检查o是否是一个Set及长度是否与set相同,如果有一个为否则返回false。
21
     * 如果均为true,则返回containsAll((Collection) o)的结果。
22
     */
23
    public boolean equals(Object o) {
24
        if (o == this)
25
            return true;
26
27
        if (!(o instanceof Set))
28
            return false;
29
        Collection c = (Collection) o;
30
        if (c.size() != size())
31
            return false;
32
        try {
33
            return containsAll(c);
34
        } catch (ClassCastException unused)   {
35
            return false;
36
        } catch (NullPointerException unused) {
37
            return false;
38
        }
39
    }
40
41
    /**
42
     * 重写父类:java.util.AbstractCollection<E>
43
     * 实现接口:java.util.Set<E>
44
     * 
45
     * 返回set的hash code值。
46
     * 
47
     * 一个set的hash code值为其组成元素的hash code值之和
48
     * 等于null的元素的hash code值被定义为0
49
     * 这样可以保证对于任意两个set,s1及s2
50
     * 只要有s1.equals(s2),即有s1.hashCode()==s2.hashCode()
51
     * 满足Java规范对于hashCode()及equals(Object obj)返回关系的要求
52
     * 
53
     * 本方法迭代set
54
     * 调用set中每个元素的hashCode()
55
     * 求和作为本方法的结果返回
56
     */
57
    public int hashCode() {
58
        int h = 0;
59
        Iterator<E> i = iterator();
60
        while (i.hasNext()) {
61
            E obj = i.next();
62
            if (obj != null)
63
                h += obj.hashCode();
64
        }
65
        return h;
66
    }
67
68
    /**
69
     * 重写父类:java.util.AbstractCollection<E>
70
     * 实现接口:java.util.Set<E>
71
     * 
72
     * 本方法可选
73
     * 移除set中所有被c所包含的元素
74
     * 若c同样是一个Set,本操作实际为求差集
75
     * 
76
     * 本方法通过调用set及c的size()确定哪一个的长度更小:
77
     * 
78
     * 若set长度更小,则迭代set
79
     * 检查迭代出的元素是否被c所包含
80
     * 若包含,则调用迭代器的remove()将其从set中移除。
81
     * 
82
     * 若c的长度更小,则迭代c
83
     * 调用set的remove(Object o)从set中移除所有被迭代器返回的元素。
84
     * 
85
     * 注意,若set返回的iterator未实现remove()
86
     * 则会抛出UnsupportedOperationException。
87
     * 
88
     * 若set因本方法发生了改变则返回true,反之返回false。
89
     * 
90
     * 本方法所重写的AbstractCollection类下的方法为:
91
     * public boolean removeAll(Collection<?> c) {
92
     *     boolean modified = false;
93
     *     Iterator<?> it = iterator();
94
     *     while (it.hasNext()) {
95
     *         if (c.contains(it.next())) {
96
     *             it.remove();
97
     *             modified = true;
98
     *         }
99
     *     }
100
     *     return modified;
101
     * }
102
     * 因为Set不允许包含重复元素
103
     * 本方法重写后增加了基于长度的判断以提高算法性能。
104
     * 
105
     * @throws UnsupportedOperationException 集合不支持本方法。
106
     * @throws ClassCastException 集合中至少有一个元素的类型与c不相容。
107
     * @throws NullPointerException c==null或
108
     *                              集合中至少有一个元素为null且c不允许空元素存在。
109
     */
110
    public boolean removeAll(Collection<?> c) {
111
        boolean modified = false;
112
113
        if (size() > c.size()) {
114
            for (Iterator<?> i = c.iterator(); i.hasNext(); )
115
                // 因Set不允许包含重复元素
116
                // 故调用1次remove后即可保证set中不再包含被移除的元素
117
                modified |= remove(i.next());
118
        } else {
119
            for (Iterator<?> i = iterator(); i.hasNext(); ) {
120
                if (c.contains(i.next())) {
121
                    i.remove();
122
                    modified = true;
123
                }
124
            }
125
        }
126
        return modified;
127
    }
128
129
}

已整理层级关系

本类直接继承的类

本类直接实现的接口

综述

本类是Java集合框架中的一员。提供了Set接口的最小化实现。E表示被Set所持有的元素类型。

在遵循Set接口的额外约束(例如不允许存在重复元素)的前提下,继承本类实现Set与继承AbstractCollection实现Collection所需做的工作是相同的。

未整理层级关系

直接继承本类的类