set java底层实现_Java:List,Map,Set底层实现
1 ArrayList实现原理要点概括2 参考文献:3 http://zhangshixi.iteye.com/blog/674856l
4 https://www.cnblogs.com/leesf456/p/5308358.html
5 ArrayList是List接口的可变数组非同步实现,并允许包括null在内的所有元素。6 底层使用数组实现7 该集合是可变长度数组,数组扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量增长大约是其容量的1.5倍,这种操作的代价很高。8 采用了Fail-Fast机制,面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险9 remove方法会让下标到数组末尾的元素向前移动一个单位,并把最后一位的值置空,方便GC10 LinkedList实现原理要点概括11 参考文献:12 1.http://www.cnblogs.com/ITtangtang/p/3948610.htmll
13 2.https://www.cnblogs.com/leesf456/p/5308843.html
14 LinkedList是List接口的双向链表非同步实现,并允许包括null在内的所有元素。15 底层的数据结构是基于双向链表的,该数据结构我们称为节点16 双向链表节点对应的类Node的实例,Node中包含成员变量:prev,next,item。其中,prev是该节点的上一个节点,next是该节点的下一个节点,item是该节点所包含的值。17 它的查找是分两半查找,先判断index是在链表的哪一半,然后再去对应区域查找,这样最多只要遍历链表的一半节点即可找到18 HashMap实现原理要点概括19 参考文献:http://zhangshixi.iteye.com/blog/672697
20 参考文献:http://blog.csdn.net/lizhongkaide/article/details/50595719
21 HashMap是基于哈希表的Map接口的非同步实现,允许使用null值和null键,但不保证映射的顺序。22 底层使用数组实现,数组中每一项是个单向链表,即数组和链表的结合体;当链表长度大于一定阈值时,链表转换为红黑树,这样减少链表查询时间。23 HashMap在底层将key-value当成一个整体进行处理,这个整体就是一个Node对象。HashMap底层采用一个Node[]数组来保存所有的key-value对,当需要存储一个Node对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Node时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Node。24 HashMap进行数组扩容需要重新计算扩容后每个元素在数组中的位置,很耗性能25 采用了Fail-Fast机制,通过一个modCount值记录修改次数,对HashMap内容的修改都将增加这个值。迭代器初始化过程中会将这个值赋给迭代器的expectedModCount,在迭代过程中,判断modCount跟expectedModCount是否相等,如果不相等就表示已经有其他线程修改了Map,马上抛出异常26 Hashtable实现原理要点概括27 参考文献:http://blog.csdn.net/zheng0518/article/details/42199477
28 Hashtable是基于哈希表的Map接口的同步实现,不允许使用null值和null键29 底层使用数组实现,数组中每一项是个单链表,即数组和链表的结合体30 Hashtable在底层将key-value当成一个整体进行处理,这个整体就是一个Entry对象。Hashtable底层采用一个Entry[]数组来保存所有的key-value对,当需要存储一个Entry对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。31 synchronized是针对整张Hash表的,即每次锁住整张表让线程独占32 ConcurrentHashMap实现原理要点概括33 参考文献:http://blog.csdn.net/zheng0518/article/details/42199477
34 ConcurrentHashMap允许多个修改操作并发进行,其关键在于使用了锁分离技术。35 它使用了多个锁来控制对hash表的不同段进行的修改,每个段其实就是一个小的hashtable,它们有自己的锁。只要多个并发发生在不同的段上,它们就可以并发进行。36 ConcurrentHashMap在底层将key-value当成一个整体进行处理,这个整体就是一个Entry对象。Hashtable底层采用一个Entry[]数组来保存所有的key-value对,当需要存储一个Entry对象时,会根据key的hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据key的hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry。37 与HashMap不同的是,ConcurrentHashMap使用多个子Hash表,也就是段(Segment)38 ConcurrentHashMap完全允许多个读操作并发进行,读操作并不需要加锁。如果使用传统的技术,如HashMap中的实现,如果允许可以在hash链的中间添加或删除元素,读操作不加锁将得到不一致的数据。ConcurrentHashMap实现技术是保证HashEntry几乎是不可变的。39 HashSet实现原理要点概括40 参考文献:http://zhangshixi.iteye.com/blog/673143l
41 HashSet由哈希表(实际上是一个HashMap实例)支持,不保证set的迭代顺序,并允许使用null元素。42 基于HashMap实现,API也是对HashMap的行为进行了封装,可参考HashMap43 LinkedHashMap实现原理要点概括44 参考文献:http://zhangshixi.iteye.com/blog/673789l
45 LinkedHashMap继承于HashMap,底层使用哈希表和双向链表来保存所有元素,并且它是非同步,允许使用null值和null键。46 基本操作与父类HashMap相似,通过重写HashMap相关方法,重新定义了数组中保存的元素Entry,来实现自己的链接列表特性。该Entry除了保存当前对象的引用外,还保存了其上一个元素before和下一个元素after的引用,从而构成了双向链接列表。47 LinkedHashSet实现原理要点概括48 参考文献:http://zhangshixi.iteye.com/blog/673319l
49 对于LinkedHashSet而言,它继承与HashSet、又基于LinkedHashMap来实现的。LinkedHashSet底层使用LinkedHashMap来保存所有元素,它继承与HashSet,其所有的方法操作上又与HashSet相同。
set java底层实现_Java:List,Map,Set底层实现相关推荐
- java treemap 内存_Java中Map、HashMap、LinkedHashMap、TreeMap的区别
Map: Map是一个接口不能实例化,Map接口主要有两个实现类:HashMap和TreeMap类.其中,HashMap类按哈希算法来存取对象,而TreeMap类可以对键对象进行排序: Map提供了一 ...
- java底层机制_Java同步机制的底层实现
在多线程编程中我们会遇到很多需要使用线程同步机制去解决的并发问题,而这些同步机制就是多线程编程中影响正确性和运行效率的重中之重.这不禁让我感到好奇,这些同步机制是如何实现的呢?好奇心是进步的源泉,就让 ...
- java entryset循环_Java之Map遍历方式性能分析:ketSet 与 entrySet
keySet():将Map中所有的键存入到Set集合中.因为set具备迭代器,所以可以以迭代方式取出所有的键,再根据get方法获取每一个键对应的值,其仅能通过get()取key. entrySet() ...
- entry在java的用处_JAVA问题:Map.Entry的一般用处是什么?
2015-09-07 回答 是为了输出的方便 一般情况下,要输出map中的key 和 value 是先得到key的集合,然后再迭代(循环)由每个key得到每个value 而entry可以一次性获得这两 ...
- java list底层实现_java中linkedlist的底层实现
详情请看上面的文章,以下是我的简单总结: 1.linkedlist可序列化.可克隆.可做队列和双端队列使用 2.linkedlist的底层实现是双向循环链表 3.linkedlist有两个私有属性,一 ...
- java 线程由浅入深_Java多线程:由浅入深看synchronized的底层实现原理
Java多线程:由浅入深看synchronized的底层实现原理-1.jpg (91.72 KB, 下载次数: 0) 2018-9-21 03:55 上传 前言 前俩篇文章,我们聊了聊线程/进程的概念 ...
- 黑马程序员——Java集合基础知识之Map
android培训.java培训.期待与您交流! Map概念 要同时存储两个元素Key和Value,他们之间有映射关系,每 ...
- java框架概念_java概念(2)
java概念(2) 重载和重写 重载:同一个类中,方法名相同,参数不同 重写:父子类中,子类重新定义父类的方法 多态 多态:同一种行为,不同的对象有不同的表现形式. 重载 编译时根据参数决定调 ...
- Java集合Set,List和Map等
Java集合Set,List和Map等 1 Java集合框架 因为Java是面向对象的语言,对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.另一方面,使用Array存储对象 ...
- java nio 客户端_Java网络编程:Netty框架学习(二)---Java NIO,实现简单的服务端客户端消息传输...
概述 上篇中已经讲到Java中的NIO类库,Java中也称New IO,类库的目标就是要让Java支持非阻塞IO,基于这个原因,更多的人喜欢称Java NIO为非阻塞IO(Non-Block IO), ...
最新文章
- 二极管7种应用电路详解之五
- 10 种保护 Spring Boot 应用的绝佳方法
- mybatis mapper.xml入参
- [Swagger2]SpringBoot集成Swagger
- c语言树写入文件,如何安全地实现文件树遍历(C语言)
- BZOJ 1263 整数划分(数学+高精度)
- HBase之Region Compact流程分析
- java保留两位小数 四种方式
- mycat1.4.1小白用户入门(一)
- 时间序列分析与非参数统计
- vue项目通讯录_vue组件--通讯录
- lockdir便携式文件夹加密器(单文件绿色版)
- STM32 ADC 过采样技术
- Python中的abc模块
- Spring-Aop及jdbc总结
- 全球与中国服装测试、检验及认证市场深度研究分析报告
- 固定表头和第一列、内容可滚动的table表格
- 辉芒微IO单片机FT60F024-RB
- 苹果A16的遮羞布被撕下了,性能提升幅度有限,被嘲讽为挤牙膏
- Adobe Acrobat XI 安装版和免安装版_PDF转换软件
热门文章
- 20. Cookie 和 Session
- c语言博客作业03-函数
- 使用Python快速获取公众号文章定制电子书(一)
- ASP.NET MVC 过滤器(五)
- 你怎么看待 Bug?
- 编译安装时的--prefix参数的使用方法,很实用,mark一下
- Eclipse里不能调试J2ME程序的解决办法
- plt绘制1 / (1 + np.exp(-x))
- 千万级别数据查询优化_从千万级数据查询来聊一聊索引结构和数据库原理
- putty怎么远程控制linux应用,如何使用linux系统远程操作软件putty!