集合相关知识点

https://thinkwon.blog.youkuaiyun.com/article/details/104588551

1、集合框架图

在这里插入图片描述

2、JDK1.7 hashMap线程不安全体现在哪?

在HashMap扩容的是时候会调用resize()方法中的transfer()方法,在这里由于是头插法所以在多线程情况下可能出现循环链表,所以后面的数据定位到这条链表的时候会造成数据丢失。和读取的可能导致死循环。

3、JDK1.8 hashMap线程不安全体现在哪?

1.8的HashMap对此做了优化,resize采用了尾插法,即不改变原来链表的顺序,所以不会出现1.7的循环链表的问题。但是它也不是线程线程安全的。不安全性如下:

在多线程情况下put时计算出的插入的数组下标可能是相同的,这时可能出现值的覆盖从而导致size也是不准确的。

4、ArrayList和Vector的原理分析及区别

ArrayList原理分析(JDK1.8)
1. 采用动态对象数组实现,默认构造方法创建了一个空数组
2. 第一次添加元素,扩展容量为10,之后扩展容量:原来容量大小 + 原来容量大小/2 -->  oldCapacity + (oldCapacity >> 1) 即为原来容量的1.5倍
3. 数组不适合删除和插入操作
4. 为了防止扩容次数太多,建议在创建ArrayList时,指定初始容量
5. 线程不安全,适合在单线程使用
Vector原理分析(JDK1.8)
1. 采用动态对象数组实现,默认构造方法创建一个容量为10的数组
2. 进行扩容时,如果有指定增量,则为原来容量 + 增量 , 没有指定增量时(增量为0),则为:原来容量 + 原来容量,  即为原来容量的2倍
3. 数组不适合删除和插入操作
4. 为了防止扩容次数太多,建议在创建Vector时,指定初始容量
5. 线程安全,适合多线程访问时使用,但是在单线程使用下效率较低
ArrayList和Vector的区别?
  1. 都是对象数组实现的,都不适合删除和插入操作。
  2. 都允许存入null值,且可以是多个。
  3. ArrayList不是线程安全的,Vector是线程安全的。
  4. 创建ArrayList对象,构造函数创建的是空的对象数组,当第一次添加元素时,扩充容量为10,之后进行扩容是原来容量的1.5倍,而Vector创建对象时,构造函数创建的是容量为10的对象数组,当扩容时,如果有指定增量,则是原来容量 + 增量,否则是原来容量的2倍。

5、HashSet和TreeSet的原理分析及区别

HashSet实现原理(JDK1.8)
1.HashSet是基于哈希表(HashMap(数组+链表))实现的
2.不允许有重复,只能存一个null元素
3.不保证顺序恒久不变
4.添加元素时,把元素当做HashMap的key,而value是一个固定的Object对象
5.添加重复元素时,set不会替换key,所以不变,且是通过equals来判断是否相同。如果想让两个对象的内容相同时,是同一个对象,则可以重写hashCode方法和equals方法。
TreeSet实现原理(JDK1.8)
1.有序,基于TreeMap实现(二叉树数据结构)。
2.对象比较大小,比较对象必须实现Comparable接口或者在TreeSet的构造器传入Comparator接口的实现对象
3.当add重复元素时,TreeSet不改变,可以用来去除重复元素
4.不允许放入null值
HashSet和TreeSet的区别?
  1. hashset是哈希表实现的,TreeSet是二叉树实现的。
  2. hashSet是无序的,Treeset是自动排好序的,需要存入的对象实现Comparable接口或者传入Comparator。
  3. HashSet可以放null,且只能放一个,TreeSet不能放null值。
  4. HashSet和TreeSet都不是线程安全的。

6、HashMap和HashTable原理分析及区别

HashMap实现原理(JDK1.8)
hashMap的实现原理(JDK1.8)
 1.基于哈希表(数组+链表+二叉树(红黑树)) JDK1.8
 2.默认加载因子为0.75,默认数组大小是16
 3.如何将对象存储在哈希表中?
 //hash()内部实现:  hash = (key.hashCode()) ^ (h >>> 16)
 //下标索引计算 : (n - 1) & hash    n: 数组长度
 通过hash()方法计算key的hash值,然后用这个hash值取余数组的长度16(默认), 来确定该对象在数组存储的位置,
 当这个位置有多个对象时,以链表结构存储,在JDK1.8后,当链表的长度大于8时,会转为红黑树存储结构。
 目的是为了取值更快,存储的数据量越大,性能表现更卓越。
 4.扩充原理: 当数组的存储容量大于阈值75%(默认),数组进行扩充,扩充为原来的2倍    newCap = oldCap << 1
 5.线程不安全,适合在单线程下使用。
 6.如果存储相同key的元素时,会覆盖掉原来的value,key不做处理。
 7.key是通过hashCode和equals方法比较是否相等。
HashTable实现原理
1.JDK1.0开始
2.基于哈希表实现(数组+链表)
3.默认数组大小为11,加载因子0.75
4.扩充方式:原数组的大小 << 1  + 1
5.线程安全
HashMap和HashTable的区别?
  1. HashMap实现Map接口,HashTable继承Dictionary类。
  2. HashMap不是线程安全的,HashTable是线程安全的。
  3. HashMap允许一条记录的键为null,允许多条记录的值为null,而HashTable的key和value都不能为null。
  4. HashMap的初始容量是16,HashTable的初始容量为11,负载因子默认都是0.75。
  5. HashMap的扩容是原来容量的2倍(只有链表长度大于8,且数组长度大于64,才会转为红黑树,否则只是扩容),HashTable的扩容是原理容量的2倍+1。
  6. HashMap的实现是数组 + 链表 + 红黑树,而HashTable的实现是数组 + 链表。
  7. HashMap需要重新计算Hash值,而Hashtable直接使用对象的HashCode值。
  8. HashMap和HashTable判断key是否相等使用的是hash和equals。
TreeMap和HashMap的区别?
  1. HashMap是基于(数组 + 链表 + 红黑树)实现,TreeMap是基于红黑树实现的
  2. HashMap是无序的,TreeMap是基于键进行排序的。
  3. HashMap的key和value 可以存null,key只能存一个,TreeMap的key不能为null,value可以为null
  4. HashMap适用于插入,删除,定位元素,TreeMap适用于按自然顺序或自定义顺序遍历键。
  5. HashMap和TreeMap都是线程不安全。

7、HashMap jdk1.8源码分析

https://blog.youkuaiyun.com/Linging_24/article/details/132796832

8、ConcurrentHashMap jdk1.8源码分析

https://blog.youkuaiyun.com/Linging_24/article/details/132745620

9、其他容器

https://blog.youkuaiyun.com/qq_45738250/article/details/128827791

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值