集合List和Map

本文详细介绍了Java集合框架中的ArrayList和LinkedList的区别,包括它们的数据结构、操作效率以及扩容机制。ArrayList基于动态数组,适合随机访问,而LinkedList是双向链表,适合插入和删除操作。同时,文章还探讨了HashMap的实现原理,包括JDK1.7和1.8的区别,以及put方法和扩容机制的工作流程。
摘要由CSDN通过智能技术生成

Java集合框架体系

ArrayList底层的实现原理

初始化后ArrayList添加元素的步骤

首先计算数组的容量,如果当前数组已使用长度+1后的大于当前的数组长度,则调用grow方法扩容(原来的1.5倍),确保新增的数据有地方存储之后,则添加元素到size的位置上。返回添加成功布尔值。

ArrayList list=new ArrayList(10)中的list扩容几次

数组与List之间的转换

用Arrays.asList转List后,如果修改了数组内容,list受影响吗List用toArray转数组后,如果修改了List内容,数组受影响吗?

用Arrays.asList转List后,如果修改了数组内容,list会受影响,因为在集合的构造器中,数组和List集合指向同一个地址。

List用toArray转数组后,如果修改了List内容,数组不受影响,因为底层他是数组的拷贝,跟原来的元素就没关系了。

链表

单向链表和双向链表的区别

单向链表只有一个方向,结点只有后继指针next。

双向链表有两个方向,结点有后继指针next和前驱指针prev。

链表操作数据的时间复杂度多少

ArrayList和LinkedList的区别是什么

1、底层数据结构:ArrayList是动态数组实现的,更节省空间,LinkedList是双向链表实现的,更占用内存。

2、操作数据的效率:

查找效率,LinkedList的时间复杂度是O(n),对于ArrayList,给定下标的时间复杂度是O(1),下标未知的时间复杂度是O(n)。

插入删除效率,对于LinkedList,在首尾的效率为O(1),其他位置是O(n),对于ArrayList,首部的效率为O(1),其他位置是O(n)。

3、线程安全:

ArrayList和LinkedList都不是线程安全的。

有两种方法使其线程安全:

第一种:在方法内部使用,局部变量则是线程安全的。

第二种:将其转换为线程安全的集合。

HashMap常用api

mp.put("one",1); //存放键值对

mp.get("one"); //通过键取值,输出 1

mp.containsKey("one")); //HashMap中是否包含该键

mp.containsValue(1)); //HashMap中是否包含该值

mp.isEmpty()); //判断是否为空

mp.size()); //输出 HasMap 的长度

mp.values());//输出所有值

mp.keySet());//输出所有键

mp.entrySet());//输出所有键和值

HashMap实现原理

HashMap的jdk1.7和jdk1.8的区别

jdk1.7的HashMap采用数组加链表的方式。jdk1.8的HashMap采用数组加链表加红黑树的方式。当数组长度大于64并且链表长度大于8时,链表转换为红黑树。

HashMap的put方法的具体流程

  1. 首先,put方法接收两个参数:键(key)和值(value)。根据键的哈希值,确定要将键值对插入到HashMap的哪个桶(bucket)中。

  2. 如果要插入的桶为空,直接将键值对作为新的桶节点插入该位置即可。

  3. 如果要插入的桶不为空,即发生了哈希冲突,根据键的哈希值和equals方法进行比较来判断键是否已经存在于桶中。

  4. 如果存在相同的键,则更新对应键的值为新的值。

  5. 如果不存在相同的键,则将新的键值对作为桶的新节点插入到链表的头部或红黑树中。

  6. 插入完成后,如果数组长度大于64并且链表长度大于8时,链表转换为红黑树,以提高查询效率。

  7. 最后,如果插入操作导致HashMap的大小超过了负载因子(通常为0.75)乘以容量的阈值,就会触发扩容操作,重新调整HashMap的容量,以保持较低的哈希冲突率。


HashMap的扩容机制

  1. 当HashMap中存储的元素数量达到负载因子(load factor)乘以当前容量的阈值时,就会触发扩容操作。扩容时,HashMap会创建一个新的桶数组,其容量是旧数组的两倍。

  2. 接下来,HashMap会遍历原来的桶数组中的每个桶,并将桶中的元素重新分配到新的桶数组中的相应位置。重新分配的过程会根据键的哈希值重新计算桶的位置。

  3. 在重新分配元素的过程中,如果原来的桶中只有一个元素,那么该元素可以直接放入新的桶中。如果原来的桶中有多个元素,会涉及到链表或红黑树的重组操作,以保持元素在新的桶中的相对顺序。

  4. 扩容完成后,HashMap的容量就会更新为新的容量,并且新的桶数组会取代原来的桶数组成为HashMap的内部存储结构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值