源码之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 ...
随机推荐
- Java并发编程原理与实战二十九:Exchanger
一.简介 前面三篇博客分别介绍了CyclicBarrier.CountDownLatch.Semaphore,现在介绍并发工具类中的最后一个Exchange.Exchange是最简单的也是最复杂的,简 ...
- Table of Contents
程序设计 Java JavaSE Apache Commons Servlet & JSP Maven JMS ActiveMQ WebService CXF Jersey HttpClien ...
- [hadoop]hadoop api 新版本与旧版本的差别
突然现在对以后的职业方向有些迷茫,不知道去干什么,现在有一些语言基础,相对而言好的一些有Java和C,选来选去不知道该选择哪个方向,爬了好多网页后,觉得自己应该从java开始出发,之前有点心不在焉,不 ...
- python(32):多进程(2) multiprocessing
python 多线程:多线程 由于Python设计的限制(我说的是咱们常用的CPython).最多只能用满1个CPU核心. Python提供了非常好用的多进程包multiprocessing,你只需要 ...
- Word Ladder I & II
Word Ladder I Given two words (start and end), and a dictionary, find the length of shortest transfo ...
- [转]在C#程序设计中使用Win32类库
http://blog.163.com/j_yd168/blog/static/496797282008611326218/ C# 用户经常提出两个问题:“我为什么要另外编写代码来使用内置于 ...
- Java关于网络编程回顾
一.Java网络编程三要素:1.IP地址:是要确定发送的地址,IP地址一般分为5类. 2.端口:要确定发送的程序是哪一个,端口的范围是0--65535,其中0-1024是系统使用或保留端口 3.协议: ...
- 17 Go Slices: usage and internals GO语言切片: 使用和内部
Go Slices: usage and internals GO语言切片: 使用和内部 5 January 2011 Introduction Go's slice type provides a ...
- 利用vw+rem实现移动web适配布局
基本概念 1.单位 Px(CSS pixels) 像素 (px) 是一种绝对单位(absolute units), 因为无论其他相关的设置怎么变化,像素指定的值是不会变化的 其实是相对于某个设备而言的 ...
- GBDT+LR simple例子
卧槽,本来猜GBDT获取的组合特征,需要自己去解析GBDT的树,scikit learn里面竟然直接调用apply函数就可以了 # 弱分类器的数目 n_estimator = 10 # 随机生成分类数 ...