集合List和Map

这篇具有很好参考价值的文章主要介绍了集合List和Map。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java集合框架体系

集合List和Map,Java面经,算法

ArrayList底层的实现原理

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

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

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

集合List和Map,Java面经,算法

数组与List之间的转换

集合List和Map,Java面经,算法

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

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

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

链表

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

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

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

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

集合List和Map,Java面经,算法

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都不是线程安全的。

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

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

第二种:将其转换为线程安全的集合。集合List和Map,Java面经,算法

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的内部存储结构。文章来源地址https://www.toymoban.com/news/detail-545253.html

到了这里,关于集合List和Map的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java 集合框架API接口】Collection,List,Set,Map,Queue,Deque

    博主: _LJaXi Or 東方幻想郷 专栏: Java | 从跨行业到跨平台 开发工具: IntelliJ IDEA 2021.1.3 Java集合API提供了一组功能强大的数据结构和算法, 具有以下作用( 简述 ) 存储和组织数据 提供高效的数据访问和操作 实现算法和数据处理 提供线程安全性 支持泛型编程 java.util.Collection

    2024年02月12日
    浏览(48)
  • 【JAVA】集合与背后的逻辑框架,包装类,List,Map,Set,静态内部类

    ❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: Collection 接口,在 Java 当中,Collection 也是重要的数据结构。 在创建 Collection 的时候,要 通过 new 来使用。但是查看 Collection 源码的时候, 发现 Collecting 是一个接口

    2024年02月07日
    浏览(41)
  • Java中用Stream流对List对象集合转Map时key值重复的操作

    看完你还不懂,你直接喷·· 定义: 1.List是一个装Dto对象的集合 2.Dto里面有ID属性,name属性等等 3.Dto里面的ID会重复  现在要把List转成以ID为key值的map,明显key不能重复啊,所以应该怎么操作呢? (需要你有java8Stream流的基本概念,map的基本概念)   操作1:重复key,选择保留

    2024年01月18日
    浏览(59)
  • 使用java8 新特性stream流对List<Map<String, Object>>集合进行遍历、过滤、查询、去重、排序、分组

    对于一个ListMapString, Object类型的数据,可以使用Java 8的新特性stream流来进行遍历、过滤、查询、去重、排序、分组等操作。 遍历: 过滤: 查询: 去重: 排序: 分组:

    2024年02月10日
    浏览(69)
  • 集合List和Map

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

    2024年02月13日
    浏览(44)
  • 【Java练习题汇总】《第一行代码JAVA》网络编程篇&集合体系篇&JDBC篇,汇总Java练习题——Socket 与ServerSocket、List和Set、Map~

    一、填空题 在类集中存放单值的最大父接口是___________ ,存放一对值的最大父接口是___________ 。 ___________ 接口保存的数据是不允许重复的,并且___________ 子类是可以排序的,根据___________ 排序。 Java 类集可以使用的输出方式是___________ 、___________ 、___________ 和___________ 。 在

    2024年02月13日
    浏览(47)
  • SpringMVC 的参数绑定之list集合、Map

    标签中name属性的值就是pojo类的属性名 参数绑定4 list [对象] form action=\\\"teaupd.do\\\" method=\\\"post\\\"     c:forEach items=\\\"${list}\\\" var=\\\"tea\\\" varStatus =\\\"status\\\"         教师编号:input type=\\\"text\\\" name=\\\"teas[${status.index}].teaid\\\" value=\\\"${tea.teaid}\\\"br/         教师姓名:input type=\\\"text\\\" name=\\\"teas[${status.index}]

    2024年02月22日
    浏览(47)
  • 判断List、Map集合是否为空的方法

    1.判断List集合是否为空 1.1List集合已经完成初始化  这里的List集合已经完成了初始化操作,相当于是一个瓶子可以装水了,但是此时还没有水。  控制台输出:List is empty.  1.2List集合未完成初始化  这里的List集合,还没有进行初始化,相当于瓶子还不存在,用list.isEmpty()会产

    2024年02月15日
    浏览(62)
  • postman传参之List<Map<String,Object>>后台是map的集合

    1.控制层   2.业务层接口   3.业务层实现类   4.mapper   5.xml   6.运行结果   7.postman传参格式 [{\\\"id\\\":127,\\\"age\\\":12,\\\"name\\\":30},{\\\"id\\\":232,\\\"age\\\":12,\\\"name\\\":30}] 

    2023年04月20日
    浏览(79)
  • Map,List,Set 等集合以及底层数据结构

    集合类存放于java.util包中。集合类存放的都是对象的引用,而非对象本身。常见的集合主要有三种——Set(集)、List(列表)和Map(映射)。其中,List和Set 都 实现 了 Collection 接口,并且List和Set也是接口,而 Map 为独立接口 。常见的实现类如下: List 的实现类有:ArrayList、

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包