Java Collection 09 - AbstractSet

  关于 java.util.AbstractSet<E> 的部分笔记,AbstractSet是Set的默认最小化实现。在具体的使用场景中,由继承AbstractSet的具体实现类完成数据的存储和操作需求。本文演示代码段的执行环境基于JDK版本1.7

概述

  AbstractSet对Set接口做了最小规模的实现。实际上仅实现了Set接口的removeAll(Collection<?> c)方法。除此之外就是重写了equals(Object o)方法和hashCode()方法。由于AbstractSet继承了AbstractCollection,所以继承AbstractSet并实现Set接口的具体实现类也会包含AbstractCollection中的方法,但是要注意的是,实现类只是单纯的继承和拥有了AbstractCollection的方法,并未尝试对AbstractCollection中的方法进行覆盖。

继承关系

1
2
3
4
// AbstractSet<E>
--java.lang.Object
--java.util.AbstractCollection<E>
--java.util.AbstractSet<E>

实现接口

类名 实现接口
AbstractSet<E> Iterable<E>, Collection<E>, Set<E>

AbstractSet

Constructor Summary

protected AbstractSet()

1
2
protected AbstractSet() {
}

  默认构造函数。采用protected修饰的原因是因为AbstractSet不直接用于集合的初始化操作,而是在使用真正可用的Set集合处理类时提供一些基础准备工作。所以这个方法不应该暴露到外界去,所以不能用public修饰。同样的原因,因为AbstractSet不涉及到单例模式的设计,所以也不会是private,这样其子类也没办法继承到父类的无参构造方法。所以综上考虑,protected是最理想的选择。

部分方法

public boolean equals(Object o)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public boolean equals(Object o) {
if (o == this)
return true;

if (!(o instanceof Set))
return false;
Collection c = (Collection) o;
if (c.size() != size())
return false;
try {
return containsAll(c);
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}
}

  判断两个Set集合是否相等。如果对象o就是Set集合自身,那么直接返回true。如果o的类型不是Set及其子类,那么直接返回false。之后判断两个Set集合存储的元素数量是否相等以及存储的每个元素是否相等。

public int hashCode()

1
2
3
4
5
6
7
8
9
10
public int hashCode() {
int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
E obj = i.next();
if (obj != null)
h += obj.hashCode();
}
return h;
}

  返回当前Set集合的散列值。Set集合的散列值的计算规则是对集合中存储的所有元素的散列值相加求和,如果存储了null元素,那么其散列值为0。

public boolean removeAll(Collection<?> c)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public boolean removeAll(Collection<?> c) {
boolean modified = false;

if (size() > c.size()) {
for (Iterator<?> i = c.iterator(); i.hasNext(); )
modified |= remove(i.next());
} else {
for (Iterator<?> i = iterator(); i.hasNext(); ) {
if (c.contains(i.next())) {
i.remove();
modified = true;
}
}
}
return modified;
}

  移除Set集合中存储的所有集合c中的元素。

涉及基础知识点

  1. NIL

参考文献

  1. NIL




------------- End of this article, thanks! -------------


  版权声明:本文由N.C.Lee创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处。
  本文作者为 N.C.Lee
  本文标题为 Java Collection 09 - AbstractSet
  本文链接为 https://marcuseddie.github.io/2018/java-Collection-AbstractSet.html