
java集合源码学习分享
文章平均质量分 90
天上的云川
博客分享积累,记录成长,欢迎讨论
展开
-
HashMap源码分析
以下源码分析基于JDK8的实现希望你在阅读时,并不是第一次了解HashMap的源码哈希表在分析HashMap之前我们需要先了解什么是Hash表。Hash表也称为散列表,也有直接译作哈希表,Hash表是⼀种根据关键字值(key - value)⽽直接进⾏访问的数据结构。也就是说它通过把关键码值映射到表中的⼀个位置来访问记录,以此来加快查找的速度。在链表、数组等数据结构中,查找某个关键字,通常要遍历整个数据结构,也就是O(N)的时间级(很好理解,因为我们不知道查找的元素在什么位置,所以需要从头开始查.原创 2022-04-19 20:11:37 · 621 阅读 · 0 评论 -
JDK8中HashMap索引计算的巧妙设计
HashMap中是如何计算索引的呢?其实大体上可以分类两步:计算hash值根据hash值计算元素的下标对应的源码:1、计算hash值:// 最终返回的h就是hash值(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)2、根据hash值计算元素的下标// n表示数组的长度,i就是最终计算出来的元素应该存放的下标p = tab[i = (n - 1) & hash]添加的元素应该存放的数组中的下标,是原创 2022-04-16 11:03:38 · 1518 阅读 · 2 评论 -
HashSet底层结构和源码分析
HashSet底层是HashMap添加一个元素时,先得到hash值,然后转换成索引值如果没有直接加入如果有调用equals比较,如果相同,就放弃添加,如果不相同,则添加到最后在java8中,如果一条链表的元素个数到达TREEIFY_THRESHOLD(默认是8),并且table的大小大于等于MIN_TREEIFY_CAPACITY(默认是64),就会进行树化(红黑树)...原创 2022-01-09 20:00:33 · 5555 阅读 · 0 评论 -
ArrayList底层结构和源码分析
ArrayList底层是数组实现的,可以进行动态扩容,扩容大小为原来的1.5倍,虽然可以通过动态扩容,但是数组非常大时会特别浪费空间,因此建议初始化时预估数组大小。ArrayList允许插入重复值和空值。ArrayList实现了RandomAccess接口,支持快速随机访问,就是可以通过索引快速查到某个元素,因此遍历时使用for循环的方式效率更高。ArrayList是线程不安全的,可以通过Collections.synchronizedList将其转变为线程安全的集合,不过一般不会使用,Vector和Cop原创 2021-12-31 22:48:44 · 851 阅读 · 0 评论