Java中的List

List集合的特有方法

  • 方法介绍

    方法名描述
    void add(int index,E element)在此集合中的指定位置插入指定的元素
    E remove(int index)删除指定索引处的元素,返回被删除的元素
    E set(int index,E element)修改指定索引处的元素,返回被修改的元素
    E get(int index)返回指定索引处的元素

list中的5种遍历方式

细节点注意:

List系列集合中的两个删除的方法

 1.直接删除元素
 2.通过索引进行删除

代码示例:

 List<Integer> list = new ArrayList<>();
 ​
 list.add(1);
 list.add(2);
 list.add(3);
 ​
 //此方法删除的是1索引上的元素
 list.remove(1);
 ​
 //此方法删除的是真正的1这个元素
 Integer i = Integer.valueOf(1);
 list.remove(i);

ArrayList与数组的区别

  • 数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。

  • 一个数组实例具有固定的大小,不能伸缩。集合则可根据需要动态改变大小。

ArrayList和LinkedList简介

以下内容为查询结果

ArrayList底层是数组,查询快、增删慢;LinkedList底层是链表,查询慢、增删快;

ArrayList底层是数组,存储空间是连续的,可以根据寻址方式直接找到对应的元素位置,时间复杂度是O(1)。

举例来说:在一条街上,第一家店是001号,那么005号在第五间:

列表

但LinkedList底层是链表,存储空间不连续,需要通过指针关联,在查询过程中需要不断跳转新的地址:

LinkedList

这也是ArrayList比LinkedList查询快的原因。

Java中的原生的数组是不能扩容的,如果初始化时申请了5个元素空间,那么就最多能存5个元素。ArrayList底层也是数组,但是支持动态扩容,所以ArrayList是动态数组:

ArrayList插入数据

假设原始容量为5,那么插入新元素时就会扩容,元素拷贝等耗时操作,这就是ArrayList增删慢的原因。但是ArrayList增删元素必然会惩罚扩容和拷贝吗?

ArrayList删除元素

插入同理,尾部插入时不涉及元素拷贝。

LinkedList中,理想状态下,链表的增删操作时间复杂度为O(1):

LinkedList插入元素

LinkedList集合的特有功能

  • 特有方法

    方法名说明
    public void addFirst(E e)在该列表开头插入指定的元素
    public void addLast(E e)将指定的元素追加到此列表的末尾
    public E getFirst()返回此列表中的第一个元素
    public E getLast()返回此列表中的最后一个元素
    public E removeFirst()从此列表中删除并返回第一个元素
    public E removeLast()从此列表中删除并返回最后一个元素

问题

1 ArrayList如何添加元素?

  • 扩容:往ArryList中添加元素的时候,会首先检查是否需要扩容。当size == elementData.length时,表示数据数量已经超过了数组容量,需要扩容,扩容后的数组的长度为原来数组长度的1.5倍;

  • 复制:当扩容检查完毕后,如果添加的元素不在数组尾部,则将索引后面的元素通过System.arraycopy往后移动一位;

  • 赋值:将值赋给数组中的对应索引,并将size++;

如果此时ArrayList的长度为size,在多线程运行的情况下,线程A想要将元素存放在索引为index的位置上,但此时CPU暂停线程A的调度,线程B得到运行的机会,也是向index的位置上添加元素。之后线程A和线程B都继续运行,都会增加size的值,这样数组的长度就变成了size + 2,这样就线程不安全了。

2 ArrayList是否能无限添加元素?会抛出异常吗?

可以无限添加,不会抛出异常。ArrayList会自动为其扩容,扩容后的大小是int newCapacity = (oldCapacity * 3) / 2 + 1。

3 ArrayList和LinkedList的时间复杂度?

ArrayList是线性表(数组):

add(E e):在数组尾部添加元素,时间复杂度为O(1); add(int index, E element):在索引为index的位置添加元素,需要后面的元素后移,时间复杂度为O(n); remove(int index)/remove(Object o):删除元素,需要后面的元素后移,时间复杂度为O(n); set(int index, E element):修改元素,时间复杂度为O(1); get(int index):获取索引为index的元素,时间复杂度为O(1); LinkedList是链表操作:

add(E e):在数组尾部添加元素,时间复杂度为O(1); add(int index, E element):在索引为index的位置添加元素,指针指向操作,时间复杂度为O(1); remove(int index)/remove(Object o):删除元素,指针指向操作,时间复杂度为O(1) set(int index, E element):修改元素,时间复杂度为O(n); get(int index):获取索引为index的元素,时间复杂度为O(n);

4 ArrayList线程安全吗?为什么?如何解决多线程问题?

ArrayList线程不安全,因为相关的操作方法没有做同步,操作没有原子性,在多线程环境下会出现变量的读写异常。比如size++是非原子性的,如果两个线程同时执行,两个线程分别读了size的值,再分别执行size++,最后size的值变成了size + 1而不是size + 2。

多线程环境下使用CopyOnWriteArrayList保证线程安全,活着使用Collections.synchronizedList(list),或者给多线程的操作加锁,或者使用Vector。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【全局异常处理记录】⭐️通过自定义全局处理器有效统一各种异常并记录

目录 前言 方案 示例 测试 总结 前言 朋友们大家好啊&#xff0c;随着项目的进行&#xff0c;接口也是越来越多了&#xff0c;每个接口无论调用成功与否&#xff0c;都要有相应的应对措施&#xff0c;总不能出错的时候返回一堆异常信息给调用者&#xff0c;所以每个接口都…

MVCC【重点】

参考链接 [1] https://www.bilibili.com/video/BV1YD4y1J7Qq/?spm_id_from333.1007.top_right_bar_window_history.content.click&vd_source0cb0c5881f5c7d76e7580fbd2f551074 [2]https://www.cnblogs.com/jelly12345/p/14889331.html [3]https://xiaolincoding.com/mysql…

java基础题库详解

目录 1 JDK和JRE有什么区别&#xff1f; 1.1、JRE 1.2、JDK 2、和equals的区别是什么? 3、比较 4、装箱&#xff0c;拆箱 4.1、什么是装箱&#xff1f;什么是拆箱&#xff1f; 4.2、装箱和拆箱的执行过程&#xff1f; 4.3、常见问题 5、hashCode()相同&#xff0c;e…

让ChatGPT给你写代码????

原文链接&#xff1a;使用ChatGPT写代码靠谱吗&#xff1f; 写在前面 对于ChatGPT从我们“惊讶”到现在已经快一年多了&#xff0c;但是&#xff0c;对于个人来说&#xff0c;使用还是比较少的。更确切的来说&#xff0c;也许有些同学是没有使用过。 ChatGPT功能确实比较强大…

【latex】\IEEEpubid版权声明与正文内容重叠

问题描述 撰写IEEE Trans论文时&#xff0c;出现版权声明文字\IEEEpubid与正文内容重叠的问题&#xff1a; 原因分析&#xff1a; 在使用模板时&#xff0c;不小心将以下命令删除了&#xff1a; \IEEEpubidadjcol 解决方案&#xff1a; 在需要换页的位置附近添加以上命令&…

Spring Cloud Nacos集成Seata2.0 AT模式

Spring Cloud Nacos集成Seata2.0 AT模式 以CentOS 7为例&#xff0c;介绍Spring Cloud Nacos集成Seata2.0 AT模式的流程。分成两个步骤&#xff1a;1.安装配置seata-server、2.项目集成seata-client 一、下载seata-server安装包 根据自己的操作系统选择要下载的安装包格式&a…

计算机指令、指令跳转原理

文章目录 前言存储程序型计算机代码怎么变成机器码&#xff1f;解析指令和机器码CPU 是如何执行指令的&#xff1f;CPU中的寄存器 if…else 来看程序的执行和跳转分析 通过 if…else 和 goto 来实现循环 前言 大家好我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第三篇…

【漏洞复现】某厂商上网行为管理系统static_convert命令执行漏洞

Nx01 产品简介 天融信上网行为管理系统是天融信公司凭借多年来的安全产品研发经验&#xff0c;为满足各行各业进行网络行为管理和内容审计的专业产品。 Nx02 漏洞描述 天融信上网行为管理系统老版本static_convert.php接口存在RCE漏洞&#xff0c;攻击者利用此漏洞可以获取服务…

贪心(基础算法)--- 区间选点

905. 区间选点 思路 &#xff08;贪心&#xff09;O(nlogn) 根据右端点排序 将区间按右端点排序 遍历区间&#xff0c;如果当前区间左端点不包含在前一个区间中&#xff0c;则选取新区间&#xff0c;所选点个数加1&#xff0c;更新当前区间右端点。如果包含&#xff0c;则跳…

vscode中eslint插件不生效问题

case: 最近使用webpack打包js资源中使用到了VS Code中的eslint插件辅助eslint plugin对代码进行校验&#xff0c;却在.eslintrc.js文件中以及webpack.config.js配置好后&#xff0c;在控制台运行npx webpack可以读取到eslint plugin的检测结果; 1. 但是eslint插件却始终不生效…

Python爬取天气数据及可视化分析!(含源码)

天气预报我们每天都会关注&#xff0c;我们可以根据未来的天气增减衣物、安排出行&#xff0c;每天的气温、风速风向、相对湿度、空气质量等成为关注的焦点。本次使用python中requests和BeautifulSoup库对中国天气网当天和未来14天的数据进行爬取&#xff0c;保存为csv文件&…

C++ sort排序

sort函数接受两个迭代器作为参数&#xff0c;分别表示要排序的范围的起始和结束位置。 请注意&#xff0c;sort函数默认使用小于运算符&#xff08;<&#xff09;来比较元素的顺序&#xff0c;默认从小到大排。 在这里&#xff0c;使用str.begin()和str.end()来表示整个字符…

华为机试-算法一

寻找身高相近的小朋友 小明今年升学到了小学1年纪来到新班级后&#xff0c;发现其他小朋友身高参差不齐 然后就想基于各小朋友和自己的身高差&#xff0c;对他们进行排序请帮他实现排序 输入描述 第一行为正整数 h和n 0<h<200 为小明的身高 0<n<50 为新班级其他小…

Muduo库编译学习(1)

1.muduo库简介 muduo是由Google大佬陈硕开发&#xff0c;是一个基于非阻塞IO和事件驱动的现代C网络库&#xff0c;原生支持one loop per thread这种IO模型&#xff0c;该库只支持Linux系统&#xff0c;网上大佬对其褒贬不一&#xff0c;作为小白用来学习就无可厚非了。 git仓库…

阅读笔记 | Transformers in Time Series: A Survey

阅读论文&#xff1a; Wen, Qingsong, et al. “Transformers in time series: A survey.” arXiv preprint arXiv:2202.07125 (2022). 这篇综述主要对基于Transformer的时序建模方法进行介绍。论文首先简单介绍了Transformer的基本原理&#xff0c;包括位置编码、多头注意力机…

二十三、剖析 LinkedList

剖析 LinkedList 本文为书籍《Java编程的逻辑》1和《剑指Java&#xff1a;核心原理与应用实践》2阅读笔记 ArrayList随机访问效率很高&#xff0c;但插入和删除性能比较低&#xff1b;LinkedList同样实现了List接口&#xff0c;它的特点与ArrayList几乎正好相反。除了实现了L…

springboot240基于Spring boot的名城小区物业管理系统

基于Spring boot的名城小区物业管理系统的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于物业信息的管理和控制&#xff0c;采用人工登记的方式保存相关数…

来不及了!大学必须完成的四件事!

老师们常说&#xff0c;上大学就轻松了 其实不然 大学不是人生的终点&#xff0c;而是新的起跑线 不是休息站&#xff0c;而是进入社会的最后冲刺跑道 大学生活苦乐参半&#xff0c;成人世界即将来临 出了校门&#xff0c;你会发现社会复杂多变&#xff0c;需要不断学习 稍…

社区店选址评估:利用大数据选址的技巧与策略

在当今数字化的时代&#xff0c;利用大数据进行社区店选址评估已成为一种高效、科学的方法。作为一名开鲜奶吧5年的创业者&#xff0c;我将分享一些利用大数据选址的技巧与策略&#xff0c;帮助你找到最适合的店铺位置。 1、确定目标商圈 在选址之前&#xff0c;首先要明确自己…

airTest连接雷电模拟器后,打开横屏游戏,airTest设备窗显示游戏是横屏,雷电模拟器却显示竖屏

目录 airTest连接雷电模拟器后&#xff0c;打开横屏游戏&#xff0c;airTest设备窗显示游戏是横屏&#xff0c;雷电模拟器却显示竖屏 原因&#xff1a;雷电模拟器4会出现兼容性问题。 解决&#xff1a;升级到雷电模拟器9.0.66(9)&#xff0c;可解决该问题。