源码之Java集合
No1:
ArrayList的扩容策略是,新容量扩大为原来的1.5倍。
ArrayList不是线性安全的,因为没有使用synchronized关键字,但是优点是效率提高了。与之相比,Vector是线性安全的。
ArrayList解决线程不安全的办法就是使用synchronized关键字,哈哈哈
No2:
ArrayList的内部类SubList是父类的一个视图,其上的操作都会反射到父类ArrayList上。
比如:删除ArrayList从100到200的数据,使用方法
list.subList(100,200).clear();
即可
No3:
HashMap允许使用null值和null键
HashMap也是线程不安全的。
No4:
jdk1.8之前HashMap是基于数组+链表来实现,具有相同hash值的节点连在一个链表或树中。
jdk1.8中HashMap采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,大大减少了hash冲突时查找时间(从原来的O(n)->O(logn)),由于红黑树的节点空间是链表空间的2倍,为了节省空间,当链表长度减少到阈值(6)时,又会转换为链表形式。
No5:
HashMap链表中的结点对应HashMap中的Entry类(jdk1.8之前)或Node类(jdk1.8之后)。
HashMap其实就是一个Entry(或Node)数组,Entry(或Node)对象中包含了键和值,其中next也是一个Entry(或Node)对象,它就是用来处理hash冲突的,形成一个链表。
No6:
HashMap初始容量为16,加载因子是0.75,当HashMap中的元素个数超过数组大小*加载因子时,就会进行扩容,一般是扩容为2倍。
No7:
fail-fast机制:即快速失败机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。因为HashMap不是线程安全的。
No8:
HashMap中哈希函数构造方法是先通过hashCode()方法获取h值,再通过h&(length-1)来得到所在数组的位置。
length为2的整数幂保证了length-1最后一位为1,从而保证了h&(length-1)的最后一位同时有为0和为1的可能性,保证了散列的均匀性。
No9:
HashSet内部就是使用HashMap来存储元素的。
No10:
HashSet添加元素e,确保元素不重复
map中put方法说明:
如果map中键e存在,则返回旧的键e对应的value值
如果map中键e不存在,则返回null
返回值:有重复返回false,无重复返回true
public boolean add(E e){
return map.put(e,PRESENT)==null;
}
No11:
HashTable是线程同步的。
ConcurrentHashMap是线程安全高并发的。
No12:
HashTable是用数组+链表实现。
No13:
HashTable与HashMap主要区别是,hash函数的算法
HashTable用的是典型的除留取余法:
int index = (hash&0x7FFFFFFF)%tab.length
No14:
LinkedHashMap是数组+双链表结构。继承自HashMap。
No15:
集合中的类都有一个共同的迭代方法,就是先把这个集合转化成Set视图,然后再对这个Set视图进行迭代。

源码之Java集合的更多相关文章
- 从源码看Java集合之ArrayList
Java集合之ArrayList - 吃透增删查改 从源码看初始化以及增删查改,学习ArrayList. 先来看下ArrayList定义的几个属性: private static final int ...
- 源码:Java集合源码之:数组与链表(一)
数组和链表是数据结构中最基本的部分. 数组 在java中,数组定义为一种基本类型,其可以通过下标获取到对应位置的数据.那么这种结构的数据,在内存中是怎么存放的呢? 数组在内存中是一段连续的存储单元,每 ...
- 源码:Java集合源码之:哈希表(二)
要想知道一个元素是否在数组或链表中,只能从前向后挨个对比,无论是数组还是链表,其对数据的查询表现都比较无力.在的二叉排序树中,还会将数据排序以进行二分查找,将时间复杂度从O(n)降低到O(lg n). ...
- 源码(09) -- java.util.Arrays
java.util.Arrays 源码分析 ------------------------------------------------------------------------------ ...
- 从源码学习Java并发的锁是怎么维护内部线程队列的
从源码学习Java并发的锁是怎么维护内部线程队列的 在上一篇文章中,凯哥对同步组件基础框架- AbstractQueuedSynchronizer(AQS)做了大概的介绍.我们知道AQS能够通过内置的 ...
- JDK1.8源码(五)——java.util.Vector类
JDK1.8源码(五)--java.lang. https://www.cnblogs.com/IT-CPC/p/10897559.html
- Java容器 | 基于源码分析List集合体系
一.容器之List集合 List集合体系应该是日常开发中最常用的API,而且通常是作为面试压轴问题(JVM.集合.并发),集合这块代码的整体设计也是融合很多编程思想,对于程序员来说具有很高的参考和借鉴 ...
- Java容器 | 基于源码分析Map集合体系
一.容器之Map集合 集合体系的源码中,Map中的HashMap的设计堪称最经典,涉及数据结构.编程思想.哈希计算等等,在日常开发中对于一些源码的思想进行参考借鉴还是很有必要的. 基础:元素增查删.容 ...
- Java源码之 java.util.concurrent 学习笔记01
准备花点时间看看 java.util.concurrent这个包的源代码,来提高自己对Java的认识,努力~~~ 参阅了@梧留柒的博客!边看源码,边通过前辈的博客学习! 包下的代码结构分类: 1.ja ...
随机推荐
- HDU 2814 斐波那契循环节 欧拉降幂
一看就是欧拉降幂,问题是怎么求$fib(a^b)$,C给的那么小显然还是要找循环节.数据范围出的很那啥..unsigned long long注意用防爆的乘法 /** @Date : 2017-09- ...
- android 低功耗蓝牙使用
参考链接:http://blog.csdn.net/xubin341719/article/details/38584469 1.android 手机的低功耗蓝牙,又称BLE :BLE在andriod ...
- [转载]RSA算法详解
原文:http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...
- soj1010. Zipper
1010. Zipper Constraints Time Limit: 1 secs, Memory Limit: 32 MB Description Given three strings, yo ...
- 实验一 《网络对抗技术》逆向及Bof技术
- (转载) 天梯赛 L2-018. 多项式A除以B
题目链接 题目描述 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出一个非零多项式,先给出 ...
- C/S模式和B/S模式
C/S模式和B/S模式 1.C/S模式(Client/Server,客户机/服务器模式) 如QQ 暴风影音,PPlive等应用软件都是C/S模式 是一种软件系统结构的一种,C/S模式是基于企业内部网络 ...
- MIUI7,Android版本5.0.2,一个程序发送自定义广播,另一个程序没有接收到
对照<第一行代码——Android>进行学习,第五章中说到广播包的相关知识,前面获取广播等程序例程都可以跑的通,但是在5.3.2节中,程序A发送自定义广播,并接收自定义广播,同时程序B也接 ...
- 【Linux技术】ubuntu常用命令【转】
转自:http://www.cnblogs.com/lcw/p/3159462.html 查看软件xxx安装内容:dpkg -L xxx查找软件库中的软件:apt-cache search 正则表达式 ...
- spring boot 测试用例
junit 是一个面向于研发人员使用的轻量的测试模块,适合做单元测试.而testng百度后发现更强大,可以做功能测试,但对于我这种RD,貌似junit足沟了呢! java Mock PowerMock ...