List集合详解

news2024/11/25 12:35:50

目录

1、集合是什么?

1.1、集合与集合之间的关系

 2、List集合的特点

3、遍历集合的三种方式

3.1、foreach(增强佛如循环遍历)

3.2、for循环遍历

3.3、迭代器遍历

4、LinkedList和ArrayList的区别

4.1、为什么ArrayList查询会快一些?

4.2、为什么LinkedList查询会慢一些?

4.3总结--面试常问:

4.3.1、为什么linkedList查询会比Arraylist查询慢?

4.3.2、linkedlist集合和arraylist集合的区别

5、List调优:

5.1、集合的底层

5.2、ArrayList集合的动态扩容机制

5.2.1、触发扩容机制的条件

5.2.2、扩容的流程

5.3、如何进行性能调优呢?--面试常问

6、list集合底层对象去重原理

6.1、流程:


1、集合是什么?

1、简单来说,集合就是一个存放数据的容器,并且可以对存储的内容进行增删改查

2、集合的类型主要有三种

  • list集合
  • set集合
  • map集合

1.1、集合与集合之间的关系

 2、List集合的特点

1、有序

2、可以重复

3、具备容器的基本特点,可以进行增删改查

3、遍历集合的三种方式

3.1、foreach(增强佛如循环遍历)


   
   
  1. // foreach(增强for循环)
  2. for (Object object : list) {
  3. System.out.println(object);
  4. }

3.2、for循环遍历


   
   
  1. // for循环遍历
  2. for ( int i = 0; i < list.size(); i++) {
  3. System.out.println(list.get(i));
  4. }

3.3、迭代器遍历


   
   
  1. // 迭代器
  2. Iterator iterator = list.iterator();
  3. while (iterator.hasNext()) {
  4. System.out.println(iterator.next());
  5. }

4、LinkedList和ArrayList的区别

  • LinkedList的特点:修改查询慢,新增删除快

  • arraylist集合的特点:修改查询快,新增删除慢

    为什么新增删除ArrayList会慢些?

    java集合框架05——ArrayList和LinkedList的区别_旷野之息的博客-CSDN博客

4.1、为什么ArrayList查询会快一些?

ArrayList 是基于数组实现的动态数组,它支持随机访问,可以根据元素的下标快速访问对应元素。具体来说,它内部维护了一个数组,通过索引访问数组元素的时间复杂度为 O(1)。因此 ArrayList 最适合读操作比较频繁的场景。

  ArrayList从原理上就是数据结构中的数组,也就是内存中一片连续的空间,这意味着,当我
 get(index)的时候,我可以根据数组的(首地址+偏移量),直接计算出我想访问的第index个元素在内存中的位置。

4.2、为什么LinkedList查询会慢一些?

LinkedList 是基于链表实现的,它是一个双向链表,每个节点都有指向前驱节点和后继节点的引用

LinkedList 不支持随机访问,因为它是基于链表数据结构实现的,而链表与数组不同,没有类似于数组的下标操作。

在链表中,每个元素通过指针连接到下一个元素,因此查询链表中的某个元素时,需要从链表的头部或尾部开始遍历,逐个比较元素的值,直到找到所需的元素。

这样的查询方式,与使用数组下标直接查找元素相比,时间复杂度要高很多

4.3总结--面试常问:

4.3.1、为什么linkedList查询会比Arraylist查询慢?

答:首先呢,arraylist他的底层的数据结构呢是一个数组,因为是数组,我们就可以直接的使用数组的get(index)方法直接的获取到数组中的元素,不需要进行遍历就可以拿到数组中的元素,但是linkedlist呢它的底层数据结构是一个双向的链表,而链表结构无法和数组一样通过get(index)直接获取到元素,只能够通过遍历去挨个查找,但是这样不仅使用了更多的资源以及更多的时间,虽然 LinkedList 不支持随机访问,但是它提供了一些查询元素的方法,比如 getFirst()、getLast()、indexOf()、lastIndexOf(),它们会沿着链表进行查询,直到找到对应的元素或者到达链表的末尾。

4.3.2、linkedlist集合和arraylist集合的区别

答:首先这两个集合的最本质上的区别就是两者的底层的数据结构是不同的,而数据结构的不同从而也导致了,两者增删改查效率的一些不同,首先arraylist集合它的特点就是,查询修改快,新增删除慢,因为是数组结构嘛,所以导致了只要在一个指定位置一移除或者增加了一条数据,那么整个数组这条数据后面的所有的数据都会进行移动,是非常耗费资源的,但是linkedlist呢他的底层就是一个链表结构,这种结构有个好处,就是移除了集合中的某个元素只需要改变那个元素的前驱节点和后继节点的指向就可以了,所以效率非常的快

查询的话我就不讲了刚刚问过了🤭


5、List调优:

5.1、集合的底层

集合的底层是什么呢?:答案是数组

那么为什么明明数组的长度是不可变的,但是集合就可以呢?

这里就涉及到了集合的动态数组扩容机制

5.2、ArrayList集合的动态扩容机制

5.2.1、触发扩容机制的条件

首先arraylist刚开始的默认长度为10,当往数组里添加内容的时候,当添加的数据长度达到10时,arraylist就会出发扩容机制

5.2.2、扩容的流程

首先创建一个新的数组,这个新数组的长度是原来数组的1.5倍,然后再使用arrays.copyof()的方法将老数组中的数据复制到新的数组之中 扩容完后,再将新的数据添加到新的数组之中去

5.3、如何进行性能调优呢?--面试常问

  • 选择合适的容器:不同的场景下需要使用不同的容器。如前所述,ArrayList 适用于读取操作比较多的场景,而 LinkedList 适用于插入和删除频繁的场景。在选择容器时,需要根据实际情况进行权衡和选择。

  • 指定初始值:在创建 ArrayList 容器时,可以指定其大小,避免频繁调整数组大小带来的性能损耗。在实际应用中,往往需要根据数据量的大小进行估算。如果确实无法估算,可以使用默认大小的初始化方法,不过记得为容器预留出一些空间,以便能够加载新元素。

  • 尽量减少扩容操作:扩容是比较耗时的操作,可以尝试通过预估所需容量来预先分配更多的容量,以减少扩容的次数。在进行大量元素添加操作时,可以使用 addAll(Collection<? extends E> c) 方法,将多个元素一同添加到 List 容器中,以避免使用 add(E e) 方法频繁进行扩容操作。

  • 避免频繁的查询操作:除了 ArrayList 支持随机访问以外,其他容器需要进行遍历操作才可以得到元素。在进行查询操作时,需要尽量避免频繁的遍历操作,可以使用相应的查询方法,如 getFirst()、getLast()、indexOf()、lastIndexOf() 等。如果确实需要进行遍历操作,可以考虑使用 ListIterator 接口,以进行快速的遍历和查询。


6、list集合底层对象去重原理

6.1、流程:

遍历老集合,将集合中的每一条数据进行比较,如果新的集合中不包含条件中的数据,那么就将其放到新数组中去,看代码!


    
    
  1. public static void main (String[] args) {
  2. List list= new ArrayList();
  3. list.add( new Student( 1, "23"));
  4. list.add( new Student( 2, "23"));
  5. List list1= new ArrayList();
  6. //遍历老集合中的元素
  7. for (Object obj : list) {
  8. //如果新集合中不包含此元素,就将其加入到新集合中,最后输出新集合
  9. if(!list1.contains(obj)) {
  10. list1.add(obj);
  11. }
  12. }
  13. }

但是此时有个问题,这样子判断真的可以吗?答案是不行的

如果老集合中的数据是基本类型,那应该可以

但是如果是引用类型,就必须重写eqluas方法。为什么?

因为如果不进行重写,那么条件中进行判断的就是内存地址了,如果重写了,就是真正的比较值了,所以List去重复是根据重写的equals方法来的


注:过几天具体写一下ArrayList的扩容机制以及LinkedList如何去创建一个堆栈容器,还搞得不是很懂😶‍🌫️

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/994682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023大数据挑战赛全国六强团队获奖经验+ppt分享(五)

团队名称 会魔法的老人 团队成员 刘克林&#xff08;重庆邮电大学&#xff09; 敖宇&#xff08;重庆邮电大学&#xff09; 杨敏&#xff08;重庆邮电大学&#xff09; 团队名次 全国第二名 赛题描述说明介绍 2023大数据挑战赛赛题说明决赛评分标准回顾 参赛分享与收获 本次大赛…

x86体系结构(WinDbg学习笔记)

寄存器 eaxAccumulator累加器ebxBase register基寄存器ecxCounter register计数器寄存器edxData register - can be used for I/O port access and arithmetic functions数据寄存器-可用于I/O端口访问和算术函数esiSource index register源索引寄存器ediDestination index reg…

第50节:cesium 绘制指定类型区域(含源码+视频)

结果示例: 完整源码: <template><div class="viewer"><el-button-group class="top_item"><el-button type=

fatedier/frp内网穿透详细安装及使用教程

《参考地址》 fatedier/frp是一款开源的主要使用Go语言开发的内网穿透工具。主要分为服务端&#xff08;frps&#xff09;和客户端&#xff08;frpc&#xff09;。 简单理解&#xff1a;服务端&#xff08;frps&#xff09;就是部署到公网ip服务器提供给客户端&#xff08;frpc…

MySQL中的字符集和排序规则

关键字: 字符集&#xff0c;utf8mb4&#xff0c;emoj 众所周知&#xff0c;mysql的utf8是假的utf8&#xff0c;没法存emoj等字符。要设置为utf8mb4... 问题 同事给了一段Update语句&#xff0c;更新某张表idxxx的某个字段; CREATE TABLE table_name ( id int(11) NOT NULL AUT…

OLED透明屏厚度:引领未来显示技术的革命

OLED透明屏作为一种未来显示技术&#xff0c;其薄度在整个行业中具有重要意义。 在这篇文章中&#xff0c;尼伽将详细介绍OLED透明屏厚度的优势、技术挑战以及应用案例&#xff0c;旨在为读者全面了解OLED透明屏的发展前景。 一、OLED透明屏厚度的优势 OLED透明屏采用柔性基板…

在FPGA上快速搭建以太网

在本文中&#xff0c;我们将介绍如何在FPGA上快速搭建以太网 &#xff08;LWIP &#xff09;。为此&#xff0c;我们将使用 MicroBlaze 作为主 CPU 运行其应用程序。 LWIP 是使用裸机设计以太网的良好起点&#xff0c;在此基础上我们可以轻松调整软件应用程序以提供更详细的应用…

zemax多重结构仿真分光板

光路中的分光板需要使用多重结构来仿真 首先做一个倾斜的分光板&#xff0c;然后用多重结构表现两个光路 基础设置&#xff1a; 效果&#xff1a; 设置平板倾斜45度&#xff1a; 1、表面设置为倾斜面 2、y方向正切设置为1 效果&#xff1a; 设置多重结构&#xff0c;这里是…

【100天精通Python】Day56:Python 数据分析_Pandas数据清洗和处理(删除填充插值,数据类型转换,去重,连接与合并)

目录 数据清洗和处理 1.处理缺失值 1.1 删除缺失值&#xff1a; 1.2 填充缺失值&#xff1a; 1.3 插值&#xff1a; 2 数据类型转换 2.1 数据类型转换 2.2 日期和时间的转换&#xff1a; 2.3 分类数据的转换&#xff1a; 2.4 自定义数据类型的转换&#xff1a; 3 数…

数学分析:势场

首先从散度的物理解释开始。首先&#xff0c;在球内的向量场的散度的积分&#xff0c;等于它在球边界上的流量的积分。所以根据积分中值定理&#xff0c;我们可以这么理解散度&#xff0c;它就是这个体积内的速度场的平均密度。而速度场只和源有关&#xff0c;所以它表示的某个…

Prometheus+Grafana 搭建应用监控系统

一、背景 完善的监控系统可以提高应用的可用性和可靠性&#xff0c;在提供更优质服务的前提下&#xff0c;降低运维的投入和工作量&#xff0c;为用户带来更多的商业利益和客户体验。下面就带大家彻底搞懂监控系统&#xff0c;使用Prometheus Grafana搭建完整的应用监控系统。 …

Leetcode---361周赛

题目列表 2843. 统计对称整数的数目 2844. 生成特殊数字的最少操作 2845. 统计趣味子数组的数目 2846. 边权重均等查询 一、统计对称整数的数目 这题看一眼数据范围&#xff0c;直接就可以开始暴力求解了&#xff0c;按照题目要求模拟就行&#xff0c;代码如下 class Solu…

使用纯C语言定义通用型数据结构的方法和示例

文章目录 前言以实现优先队列来描述实现思想基本类型的包装类型比较函数演示总结 前言 最近一段时间在复习数据结构和算法&#xff0c;用的C语言&#xff0c;不得不说&#xff0c;不学个高级语言再回头看C语言根本不知道C语言的强大和完美&#xff0c;不过相比之下也有许多不便…

Linux内核分析与应用

Linux 内核分析与应用[1] 蜻蜓点水,可作抛砖引玉 1.概述 用到的几个命令: insmod dmesg[2] lsmod[3] 章节测试: 部分可参考[4] <1>. Linux得以流行&#xff0c;是因为遵循了GPL协议&#xff0c;并不是因为遵循POSIX标准 (错) linux操作系统概述[5] linux概述[6] <2>…

建站系列(三)--- 网络协议

目录 相关系列文章前言一、定义二、术语简介三、协议的组成要素四、网络层次划分五、常见网络协议划分六、常用协议介绍&#xff08;一&#xff09;TCP/IP&#xff08;二&#xff09;HTTP协议&#xff08;超文本传输协议&#xff09;&#xff08;三&#xff09;SSH协议 相关系列…

robotframework 获取当前时间

1、获取年月日时分秒格式的数据 命令&#xff1a;${time} Get Current Date result_format%Y%m%d%H%M%S 日期时间显示结果显示形式&#xff1a;20230908102553 2、获取时间戳形式的数据 命令&#xff1a; ${time} Get Current Date result_formattimestamp …

私有gitlab的搭建和配置教程

文章目录 1. 说明2. 安装操作2.1 依赖项2.2 gitlab-ce2.3 简要配置2.4 网页操作2.5 中文配置2.6 其他操作 3. 配置https3.1 配置证书3.2 url配置3.3 网页访问3.4 认证错误 4. ssh操作4.1 生成文件4.2 web配置4.3 额外操作 1. 说明 此教程基于Ubuntu22.04进行阐述&#xff0c;只…

# Spring MVC与RESTful API:如何设计高效的Web接口

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

【MySQL】详解聚合查询、多表查询

MySQL 增删查改&#xff08;进阶&#xff09; 文章目录 MySQL 增删查改&#xff08;进阶&#xff09;01 表的设计表的三大范式 02 查询操作进阶新增聚合查询countsumavgmaxmin 分组查询 GROUP BYHAVING 联合查询/多表查询关键思路引入内连接外连接左外连接&#xff1a;left joi…

WAMP服务器对python进行配置

WAMP服务器中安装python WAMP服务器中安装python 步骤 D:\wamp\bin\apache\Apache2.4.4\conf\httpd.conf // 打开找到Wamp安装目录下&#xff0c;apache的配置文件 将该配置文件备份一份 LoadModule cgi_module modules/mod_cgi.so // 找到配置文件中该行&#xff0c;把行前面…