集合源码浅析

集合源码分析 一.集合的基本数据结构 1.数组 特点: 内存地址连续,使用之前必须要指定数组长度 可以通过下标访问的方式访问成员,查询效率高 增删操作会给系统带来性能消耗[保证数据下标越界的问题,需要动态扩容] 2.链表 特点: 灵活的空间要求,存储空间不要求连续 不支持下标的访问,支持顺序遍历检索 针对增删效率会更高些,只和操作节点的前后节点,无需移动元素存储位置 3.树 二叉树优点: 某节点的左子树节点值仅包含小于该节点值 某节点的右子树节点值仅包含大于该节点值 左右子树每个也必须是二叉查找 阅读详情

目录

Arraylist

HashTable

HashSet

HashMap

参考

1、hashmap属性概念

2、源码分析

简介

1、如何hash

2、如何获得原Node

2、何时扩容

3、怎么扩容(2n)

4、何时由链表变成红黑树

ConcurrentHashMap

Arraylist

1、底层是数组,扩容时按照1.5倍进行扩容,最大查不到是整数的最大值。

HashTable

类似hashmap通过synchronized对put和get方法进行加锁,加锁过于粗暴,目前被ConcurrentHashMap替换,所以暂时先不考虑。

1、如何计算索引

int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;

2、扩容数量

int oldCapacity = table.length;
int newCapacity = (oldCapacity << 1) + 1;
Entry<?,?>[] newMap = new Entry<?,?>[newCapacity];

HashSet

内部通过HashMap实现,值存入key中,value为一个Object常量对象

HashMap

参考

1、hashmap属性概念

https://blog.youkuaiyun.com/hollis_chuang/article/details/80402751

2、源码分析

https://www.cnblogs.com/xiaoxi/p/7233201.html

简介


HashMap为数组+链表+红黑树的数据结构

1、如何hash

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

2、如何获得原Node

n为数组长度
(p = tab[i = (n - 1) & hash])

备注:

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}


2、何时扩容

键值对大于阀值时或者初始化时,就调用resize方法进行扩容。重新计算数组大小,重新计算元素位置。

3、怎么扩容(2n)

数组大小扩容为原来的2倍

4、何时由链表变成红黑树

链表大小>8,并且数组长度>64

ConcurrentHashMap

CAS+同步锁+volatile

put

  1. 如果hash没有冲突,通过cas进行添加新元素;
  2. 如果hash冲突,链表首节点,或者红黑树的根节点加入synchronized锁进行元素添加(因为监视器是对应数组中的一个对象,也算是分段锁),进行添加操作,可能覆盖、添加进链表、添加进树中。

get

1、使用volatile修饰来保证某个变量内存的改变对其他线程即时可见。可以配合CAS实现不加锁对并发操作的支持。get操作可以无锁,是由于Node的元素val和指针
next是使用volatile修饰的,在多线程环境下,A线程修改节点val或者新增节点对B线程都是即时可见的,保证了数据的一致性。

  • volatile修饰Node对象

  • get方法

 

TreeMap

 TreeMap底层是树形(红黑树)结构,作为Map的一员,包含着key--value形式的元素,和HashMap最大的区别是丢进去的东西自动排序。要注意的是默认的是对Key排序,也可以重写Comparator对Value排序,很方便。

Map排序(Java)_shuangmu_chenglin的博客-优快云博客_map排序

面试必备:Java集合源码浅析 说明:以下内容的分析源码,如没有特别说明,均来自JDK8.集合主要分为两组:单列集合和双列集合 单列集合一般是指存放单个对象的集合,而双列集合一般是以键值对形式存放的数据的集合。接口下有两个重要的子接口 ,,他们的实现子类都是单列集合。接口的实现子类有 、、,也都是双列集合。以下是集合类下两大主接口的类图关系。由于 接口直接继承了 ,它是没有实现的,它的所有方法都是由它的子接口的实现类进行实现,所以这里就以 下子接口 的实现类 来讲解。注意 是有序集合且元素可以重复,而 则是无序集合,元素不可重复 阅读详情

相关推荐

晶振匹配电容容值计算方法

在使用晶振时,应仔细参考晶振规格书,以确保正确选择匹配电容,从而获得稳定和精准的时钟源。

aidi1111的博客 4653

Java集合(超详细-含源码)

集合是我们在开发中最常用的数据结构,集合分为单列集合和双列集合,不同的集合有各自的特点。我们在实际开发中,要根据问题来使用合适的集合。

m0_63975764的博客 1039

VulnHub系列之BadStore_123渗透测试

BADSTORE: 1.2.3 早期网商系统漏洞鉴赏(2004)

Flynn的博客 1630

conda 国内源配置

修改~/.condarc show_channel_urls: true channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free channel_alias: h...

templarzq的专栏 4931

【电驱动】永磁同步电机工作原理及分类

永磁同步电机工作原理及分类

星Yeah 的博客 7328

解决MATLAB2020B关于找不到vs2019C++编译器问题

解决MATLAB2020B关于找不到vs2019C++编译器问题

wcm2577的博客 7606

Java集合源码解析

文章目录1、集合包1.1 ArrayList实现方式创建:ArrayList()插入对象:add(E)删除对象:remove(E)获取单个对象:get(int)遍历对象:iterator()判断对象是否存在:contains(E)注意要点1.2 LinkedList实现方式LinkedList()add(E)remove(E)get(int)iterator()contains(E)注意要点1.3 Vector实现方式Vector()add(E)remove(E)get(int)iteratorcont..

qq_30233583的博客 1658

1.triton镜像使用

1)拉取镜像2)启动容器指定模型仓库时可以执行server下的./fetch_model.sh,见2.2部分GPU版本的启动CPU版本的启动区别只在于--gpus=1这个参数注意:docker19.03之前的版本使用gpu要指定显卡硬件名,docker19.03之后的需要安装nvidia-container-toolkit或nvidia-container-runtime安装之后要重启docker查看gpus参数是否安装成功重新执行我遇到了如下错误先使用非GPU版本的。

天启的博客 2077

分享84个NET源码,总有一款适合您

NET

zy0412326的专栏 1512

【JS】自定义上传组件,文件上传与回显,自定义进度条显示(基于element-plus与axios)

公司是做B 端产品的,有sass平台也有源码交付的项目,最近开发了很多小系统,这里记录一下开发遇到的问题。 需要定制一个上传组件,要求可以自定义文件存储路径,自定义可上传的文件类型,限制文件大小等,并且提供基础的文件回显功能,例如上传一张图片到服务器指定目录的`/file`文件夹下面,并且实现可以查看预览的功能。

余浩的博客 1162

【软考高项】五十一、常见必会的几种进度网络图(单代号、双代号、七格图、横道图)

软考高项计算题进度网络图画图介绍

有莘不破的博客 3万+

ArrayList集合源码浅析

ArrayList集合源码浅析ArrayList简介主要成员变量构造函数1、无参构造函数2、带有参数为初始容量initialCapacity的构造函数3、带有参数为Collection集合的构造函数主要操作方法add方法(添加单个元素)add方法(批量添加,在指定位置添加)remove方法get方法总结 ArrayList简介 ArrayList 是 Java 集合框架中比较常用的数据结构了。ArrayList是可以动态增长和缩减的索引序列,内部封装了一个动态再分配的Object[]数组 这里我们可以看到

Delimma_A的博客 321

古月居ros2入门21讲里面7.节点:机器人的工作细胞,报错:QSocketNotifier: Can only be used with threads started...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1824

Java 集合框架 源码浅析 与理解

Java集合框架 collection map set hashmap hashset queue

永远不要停下学习的脚步。 7024

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

常用集合之LinkedList源码浅析

上一篇 【ArrayList和Vector源码解刨对比】 先看 LinkedList 部分源码: public class LinkedList&amp;amp;amp;amp;amp;amp;amp;amp;lt;E&amp;amp;amp;amp;amp;amp;amp;amp;gt; extends AbstractSequentialList&amp;amp;amp;amp;amp;amp;amp;amp;lt;E&amp;amp;amp;amp;amp

我弟是个程序员 4498

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java集合框架源码下载_Java集合框架源码浅析

集合框架示图Collection接口和Map接口 方法API介绍Collection接口:boolean add(E e) :添加元素到集合中boolean addAll(Collection extends E> c) : 将指定 collection 中的所有元素都添加到此 collection 中(可选操作)。void clear() : 移除此 collection 中的所有元素(可...

weixin_39592315的博客 199

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

常用集合之HashSet源码浅析

类图 源码 构造方法 public class HashSet&amp;amp;amp;amp;lt;E&amp;amp;amp;amp;gt; extends AbstractSet&amp;amp;amp;amp;lt;E&amp;amp;amp;amp;gt; implements Set&amp;amp;amp;amp;lt;E&amp;amp;amp;amp;gt;, Cloneable, java.io.Ser

我弟是个程序员 4465

Java集合 List实现类 ArrayList<E> 源码浅析

Java集合 List实现类 ArrayList 实现浅析 #List 简述 List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。) ##ArrayList 源码实现基于 jdk 1.8

程序猿-Jojo 3568

Java集合源码浅析(一) : ArrayList

(尊重劳动成果,转载请注明出处:https://yangwenqiang.blog.youkuaiyun.com/article/details/105317442冷血之心的博客) 背景 一直都有这么一个打算,那就是将Java中常见集合的源码进行一个全面的梳理(尽管已经有很多人进行了梳理总结)。重复造轮子的意义就在于,笔者可以亲自去阅读与欣赏JDK集合源码,学习JDK设计者们那优雅的code风格。 那么,就...

冷血之心的博客 2139

Java集合——LinkedList源码浅析

一、继承关系 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable List接口:可以存储重复性数据,数据可以为null,插入有序 Deque...

weixin_42738587的博客 357

Java集合——HashMap源码浅析

一、继承关系 public class HashMap<K,V> extends AbstractMap<K,V>//继承自AbstractMap父类 implements Map<K,V>, Cloneable, Serializable//实现Map接口、克隆、序列化 二、属性及默认值 ////默认容量(哈希结构中数组默认大小)为16 st...

weixin_42738587的博客 852

redis源码浅析--五-整数集合的实现

环境说明:redis源码版本 5.0.3;我在阅读源码过程做了注释,git地址:https://gitee.com/xiaoangg/redis_annotation 参考书籍:《redis的设计与实现》 相关推荐:字节序 前言 intset是集合数据类型的底层实现之一,当结合中只包含整数元素,并且元素个数不多时,redis就会使用intset做为集合的底层实现。 一.数据结构...

王安的博客 364

常用集合之HashMap源码浅析

类图 源码 构造方法 public class HashMap&amp;amp;amp;amp;amp;amp;lt;K,V&amp;amp;amp;amp;amp;amp;gt; extends AbstractMap&amp;amp;amp;amp;amp;amp;lt;K,V&amp;amp;amp;amp;amp;amp;gt; implements Map&amp;amp;amp;amp;amp;amp;lt;K,V&amp;amp

我弟是个程序员 4498

常用集合之LinkedHashMap源码浅析

众所周知 HashMap 是一个无序的 Map,因为每次根据 key 的 hashcode映射到Entry数组上,所以遍历出来的顺序并不是写入的顺序。 因此 JDK 推出一个基于 HashMap 但具有顺序的 LinkedHashMap 来解决有排序需求的场景。 它的底层是继承于 HashMap实现的,由一个双向链表所构成。 类图 源码 数据结构 public class Link...

我弟是个程序员 4508

java集合之HashSet源码浅析

本文基于JDK1.8来进行分析。 HashSet简介 HashSet实现了Set接口,实际上是一个HashMap的实例(源码中可以看到),它不保证集合的迭代顺序,允许元素为null; HashSet不是线程安全的,要保证线程安全,可以用Collections.synchronizedSet(Set s)或者CopyOnWriteArraySet类; HashSet不允许元素重复。 源码分析 p...

空调不够冷 229

Java集合 LinkedList源码浅析

Java LinkedList源码浅析

qq_32468603的博客 644
上一篇: Nginx
下一篇: 数据结构简介
九号铅笔芯
博客等级 码龄9年 9粉丝 48原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值