<h4 id="2hash值">2.Hash值
hash=sum(每个元素的hash值) 如果元素为null,则默认hash值为0.
<h4 id="3removeallcollection">3.removeAll(Collection
<h4 id="4源码分析">4.源码分析
package sourcecode.analysis;
/**
* @Author: cxh
* @CreateTime: 18/3/21 20:42
* @ProjectName: JavaBaseTest
*/
import java.util.*;
/**
* AbstractSet是set接口的骨架实现,它减少了实现set接口的最少操作.
*
* 通过扩展此类来实现集合的过程与通过扩展AbstractCollection来实现集合的过程相同,
* 不同之处在于此类的所有子类中的所有<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>和构造<a href="/tag/hanshu/" target="_blank" class="keywords">函数</a>都必须遵守由 Set接口 强加的额外约束。
* (例如,add<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>不允许将一个对象的多个实例<a href="/tag/tianjia/" target="_blank" class="keywords">添加</a>到集合中)
*
* 注意:AbstractSet并没有覆盖任何AbastractCollection类.
* 它仅仅<a href="/tag/tianjia/" target="_blank" class="keywords">添加</a>了equals()和hashcode()<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>.
*
* AbstractSet是java集合框架中的一员.
*
* @since 1.2
*/
public abstract class AbstractSet<E> extends AbstractCollection<E> implements java.util.Set<E> {
//唯一构造器<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>,目的是为了子类对其<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a>.
protected AbstractSet() {
}
/*-------比较和hash相关的<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>--------*/
//常见的equals执行步骤
public boolean equals(Object o) {
//o是否为当前对象
if (o == this)
return true;
//类型是否为set
if (!(o instanceof java.util.Set))
return false;
//强制转化
Collection<?> c = (Collection<?>) o;
//比较size
if (c.size() != size())
return false;
try {
//<a href="/tag/diaoyong/" target="_blank" class="keywords">调用</a>AbstractCollection的<a href="/tag/fangfa/" target="_blank" class="keywords">方法</a>
return containsAll(c);
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}
}
//hash值=sum(所有元素的hash值)
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;
}
//
public boolean removeAll(Collection<?> c) {
//c不能为空
Objects.requireNonNull(c);
//set结构更改标志位:初始化为false
boolean modified = false;
//如果set的大小>参数集合c的大小
if (size() > c.size()) {
//迭代<a href="/tag/shanchu/" target="_blank" class="keywords">删除</a>,并更新modified标志位
for (Iterator<?> i = c.iterator(); i.hasNext(); )
modified |= remove(i.next());
} else {
//如果set的大小<参数集合c的大小,则set进行迭代
for (Iterator<?> i = iterator(); i.hasNext(); ) {
if (c.contains(i.next())) {
//<a href="/tag/shanchu/" target="_blank" class="keywords">删除</a>上一次迭代访问的元素,达到<a href="/tag/shanchu/" target="_blank" class="keywords">删除</a>目的
i.remove();
//更改<a href="/tag/xiugai/" target="_blank" class="keywords">修改</a>标志位modified
modified = true;
}
}
}
return modified;
}
}
@H_502_19@