2022-03-26

集合

Iterator

线程安全,遍历集合元素时集合元素被修改,抛出ConcurrentModificationException

HashMap

put

先调用hashCode,如果有entry然后再调用equals确认entry是否存在,然后覆盖value;没有entry会新建entry,默认容量是32,负荷系数0.75,扩容总是x2

get

先调用hashCode然后调用equals找到真正的entry,取出value

key的最佳实践

1.key对象应该不可变,hashCode被缓存起来性能更好
2.key需要重写equals和hashCode

和HashTable区别

1.HashTable线程安全
2.HashTable不允许key和value为空,HashMap允许一个null key

ArrayList

和Vector区别

1.Vector线程安全

和LinkedList区别

LinkedList每个节点都存储了前后节点的使用,更消耗内存

扩容机制

1.无参构造函数创建一个长度为0的数组
2.确认最小扩充容量,首次调用add时,取size和DEFAULT_CAPACITY = 10的最大值,所以第一次会直接扩容到10
3.如果数组长度小于最小扩容量,直接扩容
4.扩容使用位运算,容量为原来的1.5倍
5.Arrays.copyOf复制数组元素
6.如果计算出的新长度大于Integer.MAX_VALUE - 8,新长度取

return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;

7.add大量数据之前可以调用ensureCapacity减少重新分配次数

拷贝

浅拷贝

遍历循环复制、addAll方法、构造方法传入原集合、System.arrayCopy方法都属于浅拷贝,新数据改变会影响原属组

深拷贝

序列化
实现Cloneable接口,重写clone方法,return一个新的对象

Set

Set如何保证唯一性

先比较hashCode,如果有值,使用equals确认,相同则过滤,不同新增

ConcurrentHashMap

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录介绍 3.0.0.1 在arrayList中System.arraycopy()和Arrays.copyOf(...
    杨充211阅读 3,134评论 0 1
  • Catalog 1 HashMap原理1.1 HashMap JDK1.7实现1.2 HashMap JDK1.8...
    allen锅阅读 3,332评论 0 1
  • 本系列出于AWeiLoveAndroid的分享,在此感谢,再结合自身经验查漏补缺,完善答案。以成系统。 Java基...
    济公大将阅读 5,397评论 1 6
  • 一、java面试题 熟练掌握java是很关键的,大公司不仅仅要求你会使用几个api,更多的是要你熟悉源码实现原理,...
    上善若水0819阅读 8,825评论 0 1
  • Java继承关系初始化顺序 父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父...
    第六象限阅读 6,490评论 0 9