数组
查找操作的复杂度
删除操作的复杂度
ArrayList
源码分析
成员变量
构造方法
第一次添加数据
添加和扩容操作
调用add方法(这里的size初始为0,因为还没开始扩容),会先调用一个确保数组内部容量的方法,在确保的方法中又调用一个计算容量大小的方法,由于一开始的list声明是用默认构造方法构造的,所以elementData是DEFAULT..,符合计算容量方法的第一个if分支,直接返回一个默认大小10
然后调用扩容方法ensureExplicitCapacity,此时的参数为10,符合if分支,所以执行实际的扩容方法,扩容操作里,由于是第一次添加数据,所以一开始是大小是从0扩容到10.根据计算可以得到newCapacity为10,并且后面还有一部分判断最大容量的逻辑(主要用于完善),最后拷贝一下数组,从而真正的扩容到10
最后将添加的数据存入数组
至于第二次添加数据的扩容操作,可以继续往下看
第二至十次添加数据
第十次添加数据时size为9(表示ArrayList里已经有9个元素了),此时要添加第十个元素,则size+1=10.根据调用逻辑,发现第十次时仍然不需要扩容,因此第二至十次添加数据是不需要扩容的
第十一次添加数据
第十一次添加数据,size=10,此后的各种逻辑判断出需要扩容,且扩容到1.5倍即容量为15,此后若是第十六次添加数据,还是扩容到1.5倍
相关问答
如何实现数组和List之间的转换
asList底层并不涉及创建对象,而是涉及对象的引用,指向的是同一个数组
toArray底层是拷贝了一个新的数组elementData
链表
单向链表
双向链表
LinkedList
ArrayList和LinkedList的区别是什么
二叉树
概念
实现方式
分类:满二叉树、完全二叉树、二叉搜索树、红黑树等
二叉搜索树
复杂度分析,n为每一行的节点数量,每一行的查找次数为logn
极端情况
红黑树
复杂度
散列表
散列冲突
复杂度
如果使用大量不存在的key,则会导致链表长度过长,这种方式称为DDos攻击,解决方案是使用红黑树
HashMap
HashMap的实现原理
jdk1.7和jdk1.8的区别
HashMap1.7 头插法造成死循环的原因
【图解】HashMap1.7 头插法造成死循环的原因_hashmap头插法死循环图解-CSDN博客
了解的哈希冲突解决方法有哪些
HashMap的put方法具体流程
HashMap常见属性
Node数组为真正存储数据的数组,其中hash属性用于计算数据在数组中的索引位置,next用于连接链表或者红黑树
构造方法,构造时默认加载因子为0.75,且未初始化数组
put添加数据流程
HashMap的put(key,val)和get(key)过程
hashmap 调用get方法一定安全吗
HashMap的扩容机制
扩容时为什么可以拆分链表
HashMap的寻址算法
二次哈希
当使用的数组足够随机时,key在hashmap的底层数组中分布是均匀的,而如果使用的数组不够随机,key的分布则是不均匀的,甚至如上面所示很极端
解决方法是使用二次哈希(扰动算法):通过移位和异或使hash分布均匀
同时添加数据的真正方法使putVal,其中使用与运算代替取模的性能更好,但数组长度必须是2的n次
HashMap在1.7情况下多线程死循环的问题
这个问题再深入了解一下
数组与集合区别,用过哪些
说说Java中的集合
Java中的线程安全的集合是什么
Collections和Collection的区别
集合遍历的方法有哪些
讲一下java里面list的几种实现,几种实现有什么不同
Arraylist和LinkedList的区别,哪个集合是线程安全的
ArrayList线程安全吗?把ArrayList变成线程安全有哪些方法
为什么ArrayList不是线程安全的,具体来说是哪里不安全
ArrayList 和 LinkedList 的应用场景
CopyonWriteArraylist是如何实现线程安全的
HashMap是线程安全的吗
HashMap一般用什么做Key?为啥String适合做Key呢
为什么HashMap要用红黑树而不是平衡二叉树
hashmap key可以为null吗
重写HashMap的equal和hashcode方法需要注意什么
重写HashMap的equal方法不当会出现什么问题
列举HashMap在多线程下可能会出现的问题
HashMap的大小为什么是2的n次方大小呢
TODO
说说hashmap的负载因子
Hashmap和Hashtable有什么不一样的?Hashmap一般怎么用
ConcurrentHashMap怎么实现的
分段锁怎么加锁的,分段锁是可重入的吗
JDK 1.7 ConcurrentHashMap中的分段锁是 用了 ReentrantLock,是一个可重入的锁。