abstractset java_AbstractSet源码分析-java8
package sourcecode.analysis;
/**
* @Author: cxh
* @CreateTime: 18/3/21 20:42
* @ProjectName: JavaBaseTest
*/
import java.util.*;
/**
* AbstractSet是set接口的骨架实现,它减少了实现set接口的最少操作.
*
* 通过扩展此类来实现集合的过程与通过扩展AbstractCollection来实现集合的过程相同,
* 不同之处在于此类的所有子类中的所有方法和构造函数都必须遵守由 Set接口 强加的额外约束。
* (例如,add方法不允许将一个对象的多个实例添加到集合中)
*
* 注意:AbstractSet并没有覆盖任何AbastractCollection类.
* 它仅仅添加了equals()和hashcode()方法.
*
* AbstractSet是java集合框架中的一员.
*
* @since 1.2
*/
public abstract class AbstractSet extends AbstractCollection implements java.util.Set {
//唯一构造器方法,目的是为了子类对其调用.
protected AbstractSet() {
}
/*-------比较和hash相关的方法--------*/
//常见的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 {
//调用AbstractCollection的方法
return containsAll(c);
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}
}
//hash值=sum(所有元素的hash值)
public int hashCode() {
int h = 0;
Iterator 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()) {
//迭代删除,并更新modified标志位
for (Iterator> i = c.iterator(); i.hasNext(); )
modified |= remove(i.next());
} else {
//如果set的大小
for (Iterator> i = iterator(); i.hasNext(); ) {
if (c.contains(i.next())) {
//删除上一次迭代访问的元素,达到删除目的
i.remove();
//更改修改标志位modified
modified = true;
}
}
}
return modified;
}
}
abstractset java_AbstractSet源码分析-java8相关推荐
- Thread源码分析-java8
1.Thread特性分析 守护线程Daemon 定性:支持性线程,主要用于程序中后台调度以及支持性工作. 当JVM中不存在Daemon线程时,JVM将会退出. 将一个线程设定为Daemon的方法: 调 ...
- Java8 ThreadLocal 源码分析
可参考文章: Java8 IdentityhashMap 源码分析 IdentityhashMap 与 ThreadLocalMap 一样都是采用线性探测法解决哈希冲突,有兴趣的可以先了解下 Iden ...
- 【Java源码分析】Java8的ArrayList源码分析
Java8的ArrayList源码分析 源码分析 ArrayList类的定义 字段属性 构造函数 trimToSize()函数 Capacity容量相关的函数,比如扩容 List大小和是否为空 con ...
- 【Java源码分析】Java8的HashMap源码分析
Java8中的HashMap源码分析 源码分析 HashMap的定义 字段属性 构造函数 hash函数 comparableClassFor,compareComparables函数 tableSiz ...
- Java8 EnumMap 源码分析
一.EnumMap 概述 EnumMap 是一个用于存储 key 为枚举类型的 map,底层使用数组实现(K,V 双数组).下面是其继承结构: public class EnumMap<K ex ...
- Java8 PriorityBlockingQueue源码分析
在看这篇总结之前,建议大家先熟悉一下 PriorityQueue,这里主要介绍 PriorityBlockingQueue 一些特殊的性质,关于优先级队列的知识不作着重介绍,因为过程与 Priorit ...
- Java8 IdentityHashMap 源码分析
在讲这个数据结构之前,我们先来看一段代码: public static void main(String[] args) {IdentityHashMap<String, Integer> ...
- Java8 ReentrantLock 源码分析
一.ReentrantLock 概述 1.1 ReentrantLock 简介 故名思义,ReentrantLock 意为可重入锁,那么什么是可重入锁呢?可重入意为一个持有锁的线程可以对资源重复加锁而 ...
- Java8 CopyOnWriteArrayList 源码分析
一.CopyOnWriteArrayList 概述 1.1 概念概述 CopyOnWriteArrayList 是 juc 包下一个线程安全的并发容器,底层使用数组实现.CopyOnWrite 顾名思 ...
最新文章
- 自然语言处理数据集免费资源开放(附学习资料)
- 如何将Pytorch生成的模型进行CPU部署
- mysql 数据路由_node-路由操作mysql数据库
- 如何参悟Java的三大框架
- 添加中文数据出现问号_怪物猎人世界绚辉龙和冥赤龙的出现时间规律一览
- Java 生成随机数的 N 种方法
- 为什么现在的年轻人越来越不愿意结婚、生子了?
- 扎克伯格再售9500万美元股票 向裸捐目标迈近一步
- Data URI scheme
- Java随机生成中文姓名工具
- java会员消费管理系统源码_基于jsp的会员消费商场vip管理系统-JavaEE实现会员消费商场vip管理系统 - java项目源码...
- linux版高德导航软件下载,高德导航下载2021年最新版本_高德导航2021手机版下载-太平洋下载中心...
- 微信每日早安推送,快来给你女友做爱心提醒吧,自定义推送名称,企业号通知非订阅号测试号,后台python,精简无第三方网站注册、无第三方接口,无基础快速上不了手
- STM32实现俄罗斯方块
- A Survey on Big Data Market: Pricing, Trading and Protection
- android 7原生动态壁纸,手机里都是定制OS?谷歌Android 7.0原生系统壁纸邀你来尝鲜!...
- JAVA 输出 1 3 6 10 15 ....
- java毕业设计社区流浪猫狗救助网站源码+lw文档+mybatis+系统+mysql数据库+调试
- java新手案例_java初学者都要掌握的案例
- 深度学习归一化算法详解(BN,LN,IN,GN)
热门文章
- RTP协议之Header结构解析
- 北京理工大学计算机学院 王亮,王 亮
- 智能骨传导眼镜vue_穿戴设备迎新机遇,智能音频眼镜或将是下一个风口
- u9系统的使用方法仓库_HPE产品认证证书查询系统使用方法
- rsync 更改配置后, 无需手动重启
- STM32启动BOOT0 BOOT1设置方法 [
- 《CCNP TSHOOT 300-135认证考试指南》——5.10节定义关键术语
- 读书笔记《React引领未来的用户界面开发框架》
- Mysql数据库基础(一)基本概述、构建服务、基本管理、数据类型
- node.js升级后原来的Ionic项目跑不起来了解决方法