【Java集合基本问题】记录面试题宝典中自己不熟悉的Java集合

常用集合特性

1. ArrayList特性

  • 不唯一,有序:实现了List接口,该接口是序列,所以不唯一且按顺序保存
  • 不同步:因为ArrayList.add()没有synchronized同步锁控制
  • 扩容机制:初始化默认为10,每次数组容量的增长大约是其原容量的 1.5 倍
  • 底层结构:数组 private transient Object[] elementData;

2. LinkedList特性

  • 不唯一,有序:实现了List接口,该接口是序列,所以不唯一且按顺序保存
  • 不同步:因为LinkedList.add()没有synchronized同步锁控制
  • 扩容机制:链表没有扩容机制
  • 底层结构:链表

3. Vector特性

  • 不唯一,有序:实现了List接口,该接口是序列,所以不唯一且按顺序保存
  • 同步:Vector是同步的,因为方法都有synchronized修饰
  • 扩容机制:链表没有扩容机制
  • 底层结构:Vector底层数据结构是动态数组

4. HashSet特性

  • 唯一的,无序:底层是HashMap,继承了HashMap的唯一的,无序的
  • 不同步:因为add()方法没有添加同步锁synchronized
  • 扩容机制:默认初始容量是16,加载因子是0.75,扩容为原来的2倍
  • 底层结构:HashMap

5. HashMap特性

  • 唯一的,无序:键唯一,经过Hash函数,所以元素是打乱存放的
  • 不同步:因为add()方法没有添加同步锁synchronized
  • 扩容机制:默认初始容量是16,加载因子是0.75,扩容为原来的2倍
  • 底层结构:HashMap

实现线程同步

使用 Collections.synchronizedList() 方法

//这里只是对ArrayList举例,其他都是一样的
List<String> list = Collections.synchronizedList(new ArrayList<String>());
list.add("practice");
list.add("code");
list.add("quiz");

synchronzied(list)	//对变量上锁
{
	Iterator it = list.iterator();
	while (it.hasNext())
		System.out.println(it.next());
}

Map深层解析

1. Map数据结构
“数组+链表+红黑树”,
当数组元素小于64时,当链表结点大于8会优先考虑将数组扩容。
当数据元素大于64时,当链表结点大于8会转为红黑树,当红黑树结点小于6会转为链表。
在这里插入图片描述
2. Map put过程

  1. 首次扩容:
    先判断数组是否为空,若数组为空则进行第一次扩容(resize);
  2. 计算索引:
    通过hash算法,计算键值对在数组中的索引;
  3. 插入数据:
    如果当前位置元素为空,则直接插入数据;
    如果当前位置元素非空,且key已存在,则直接覆盖其value;
    如果当前位置元素非空,且key不存在,则将数据链到链表末端;
    若链表长度达到8,则将链表转换成红黑树,并将数据插入树中;
  4. 再次扩容
    如果数组中元素个数(size)超过threshold,则再次进行扩容操作。

3. HashMap为什么线程不安全?
HashMap在并发执行put操作时,可能会导致形成循环链表,从而引起死循环。
参考文章:死循环如何产生的

4. HashMap、HashTable、ConcurrentHashMap
HashMap:线程不安全、性能高
Hashtable:线程安全、性能低
ConcurrentHashMap:线程安全、性能中

5. LinkedHashMap
LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能。但因为它以链表来维护内部顺序,所以在迭代访问Map里的全部元素时将有较好的性能。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值