java集合

Java集合

Java集合概述

在这里插入图片描述

一、List、Set、Map之间的关系

  1. List 存储的元素是有序的,可以重复

  2. Set 存储的元素是无序的,不可重复

  3. Map 存储的元素是键值对

    ​ key是无序的,不可重复

    ​ value是无序的,可以重复

二、 HashMap:

  1. jdk1.8之前是数组加链表的形式来存储,数组是HashMap的主体,链表是为了解决Hash冲突问题的。
  2. jdk1.8之后采用的就是数据+链表+红黑树的形式了,当链表的长度大于8的时候就会转化为红黑树的形式存储(在转化之前,要对数组的长度是不是小于64,否则就需要堆数组先进行扩容再进行红黑树的转换),转换成红黑树的原因是因为,随着链表的长度越来越长,红黑树会减少搜索时间。

三、LinkedList和ArrayList的区别

  1. 线程安全上:都是不安全的,底层没有实现同步方法
  2. 数据结构上:一个是采用数组的形式存储的,一个使用的是双向链表
  3. 快速查找:数据结构决定了不同的功能,前者是个插入和删除操作,不适合快速查找,数组结构适合查找,不适合删除和插入操作

四、ArrayList的扩容机制

  1. 以无参构造ArrayList的时候会创建一个空的数组(由于jvm在创建一个新的对象时会对对象赋0值导致的),然后添加第一个元素的时候,会变成10的的数组容量。
  2. 当发生扩容时遵循
int newCapacity = oldCapacity + (oldCapacity>>1)

​ 所以要是原来的容量是奇数的话,扩容之后就是1.5倍左右

五、为什么HashMap的长度是2的n次幂

  1. 确定位置的时候使用的(n-1)&hash相当于就是除以2的操作

六、 ConcurrentHashMap的线程安全的实现方式

  • 1.7之前采用的是分段锁技术,每一段数据就是一个segment,默认是16个,每一个segment分配一把锁,这样不同的线程访问不同的segment可以提高并发度。

  • ​ 1.8之后,取消了segmrnt的分段式锁的结构,Synchronized做了一定的优化,使用Synchronized+CSA乐观锁的机制来保证并发度。采用和HashMap一样的底层存储结构,使用的是数组+红黑树的方式,数组是数据储存的主体,链表是为了解决Hash冲突问题。

    ​ 使用Synchronized只锁住当前链表或者是红黑二叉树的头结点

参考文章:java guide

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值