java集合的底层实现

ArrayList
(1)底层采用数组实现,若使用不带参数的构造方法,则生成长度为10的Object类型数组。
(2)若个数超过10,则生成一个新数组,长度为原数组的1.5倍+1,原数组的内容复制到新数组中。
(3)删除时,后续前移,代价高。
HashMap
(1)HashMap是基于哈希表的Map接口的非同步实现(Hashtable跟HashMap很像,唯一的区别是Hashtable中的方法是线程安全的,也就是同步的)。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
(2)在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表的数组”的数据结构,每个元素存放链表头结点的数组,即数组和链表的结合体。
(3)往HashMap中put元素的时候,先根据key的hashCode**重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾**。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。
(4)当get元素时,先计算key的hashcode(自定义的方法),找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。
(5)hash算法
key为null时,则调用putforNullKey方法,放入table[0]中。
若不为空,则int hash=hash(key.hashcode())。
这样做的目的是:改进传统的hash方法,尽量保证key的每一位都会影响到最后的hash值,以减少hash冲突。
注意:为什么capacity是2的倍数?
答:因为数组大小为2的次方时,访问性能最高,不同的key算的Index相同的几率较小,数据分布较均匀,碰撞的几率小,相对的,查询的时候就不用遍历某个位置的链表,这样查询效率高。当length总是 2 的n次方时,h& (length-1)运算等价于对length取模,也就是h%length,但是&比%具有更高的效率。8 & (15-1)和9 & (15-1)都得到0100,而8 & (16-1)和9 & (16-1)得到的是0100,0101,所以碰撞几率小。
(5)resize
当元素个数n>length*loadFactor时,进行扩容,直接扩大1倍,然后重新计算每个元素在数组中的位置,但是重新定位是非常耗时的,因此在预知元素个数时,那么最好预设元素的个数。如已知1000个元素,系统默认是1024,然而这并不合适,因为当750时就要进行扩容,所以应设置为2048。

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java集合框架是Java中用于存储和操作数据的重要工具。它提供了一组接口和类,用于处理不同类型的数据结构,如列表、集合、映射等。下面是Java集合框架的底层原理: 1. 数据结构:Java集合框架中的数据结构可以分为两类:基于数组和基于链表。基于数组的数据结构如ArrayList,它使用动态数组来实现。基于链表的数据结构如LinkedList,它使用双向链表来实现。 2. 接口和实现类:Java集合框架提供了一组接口,如List、Set、Map等,定义了不同类型的集合操作。每个接口都有一些对应的实现类,如ArrayList、HashSet、HashMap等。 3. 迭代器:Java集合框架提供了迭代器接口(Iterator),用于遍历集合中的元素。迭代器隐藏了底层集合的具体实现细节,使得我们可以以统一的方式访问集合中的元素。 4. 泛型:Java集合框架使用泛型来支持不同类型的元素存储和操作。通过使用泛型,可以在编译时检查类型安全性,并提供更好的代码重用性和可读性。 5. 效率和性能:Java集合框架在设计上考虑了效率和性能。例如,ArrayList在随机访问元素时具有较好的性能,但在插入和删除元素时较差。LinkedList在插入和删除元素时具有较好的性能,但在随机访问元素时较差。 总的来说,Java集合框架的底层原理是通过不同的数据结构和接口实现类来提供高效的数据存储和操作功能,同时使用泛型来支持类型安全性。这些特性使得Java集合框架成为开发Java应用程序中不可或缺的工具之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值