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。

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

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

相关文章

动态规划5,粉刷房子,买卖股票的最佳时期

粉刷房子 思路&#xff1a; 1.经验题目要求 dp[i][0] 表示&#xff1a;粉刷到 i 位置的时候&#xff0c;最后一个位置粉刷上红色&#xff0c;此时的最小花费。 dp[i][1] 表示&#xff1a;粉刷到 i 位置的时候&#xff0c;最后一个位置粉刷上蓝色&#xff0c;此时的最小花费。…

mybatis开发一个分页插件、mybatis实现分页、mybatis拦截器

mybatis开发一个分页插件、mybatis实现分页、mybatis拦截器 通过官网的mybatis插件说明可知&#xff0c;我们可以通过拦截器进行开发一个插件。 例如这样的&#xff1a; UserMapper mapper sqlSession.getMapper(UserMapper.class);// 开始分页MagicPage.startPage(1, 3);//…

Javascript:类型转换

一、前言 prompt与表达单取过来的值默认为string类型 二、正文 1.隐式转换 某些运算符被执行的时候&#xff0c;系统内部自动将数据类型进行转换。 规则&#xff1a; 好两边只要有一个是字符串&#xff0c;都会把另外一个转成字符串。 除了以外的算术运算符&#xff0c;比如…

Linux:线程的概念

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、线程的概念线程代码的简单示例 总结 前言 本文是对于线程概念的知识总结 一、线程的概念 在课本上&#xff0c;线程是比进程更轻量级的一种指向流 或 线程是在…

VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行

VS Code 的粘性滚动预览 - 类似于 Excel 的冻结首行功能&#xff0c;即滚动 UI 显示当前源代码范围。便于在代码行数比较多的时候更好的知道自己所在的位置。粘性滚动UI 显示用户在滚动期间所处的范围&#xff0c;将显示编辑器顶部所在的类/接口/命名空间/函数/方法/构造函数&a…

4、Linux-常用命令(二)

目录 一、搜索命令 1、命令搜索命令 2、文件搜索命令find。格式&#xff1a;find [搜索范围] [搜索条件]。 3、字符串搜索命令grep 二、帮助命令 1、man【详细的帮助】 2、--help【简要的帮助】 三、压缩与解压命令 1、.zip格式 2、.gz格式 3、打包 四、关机和重启命…

【大厂AI课学习笔记NO.57】(10)分类任务的评价指标

我们实际做的是一个分类任务。 在人工智能深度学习项目中&#xff0c;分类任务是指一种特定的任务类型&#xff0c;即预测结果是离散值的任务。具体来说&#xff0c;分类任务的目标是将输入数据划分到不同的类别中。这些类别可以是二分类&#xff08;如垃圾邮件分类&#xff0c…

理解这几个安全漏洞,你也能做安全测试

01 短信炸弹 1、漏洞描述 短信轰炸攻击是常见的一种攻击&#xff0c;攻击者通过网站页面中所提供的发送短信验证码的功能处&#xff0c;通过对其发送数据包的获取后&#xff0c;进行重放&#xff0c;如果服务器短信平台未做校验的情况时&#xff0c;系统会一直去发送短信&…

函数式响应式编程(FRP):构筑灵活动态的应用程序

FRP&#xff08;Functional Reactive Programming&#xff0c;函数式响应式编程&#xff09;是一个编程范式&#xff0c;它结合了函数式编程和响应式编程的原则&#xff0c;用于处理时间变化的数据和响应性系统。FRP 让开发者能够以声明式地方式来构建响应用户输入、网络请求或…

【vue3 路由使用与讲解】vue-router : 简洁直观的全面介绍

# 核心内容介绍 路由跳转有两种方式&#xff1a; 声明式导航&#xff1a;<router-link :to"...">编程式导航&#xff1a;router.push(...) 或 router.replace(...) &#xff1b;两者的规则完全一致。 push(to: RouteLocationRaw): Promise<NavigationFailur…

JVM内部世界(内存划分,类加载,垃圾回收)

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;JVM内部世界(内存划分,类加载,垃圾回收) 关于JVM的学习主要掌握三方面: JVM内存区的划分类加载垃圾回收 一.JVM内存区的划分 当一个Java进程开始执行时,JVM会首先向操作系统申…

实例驱动计算机网络

文章目录 计算机网络的层次结构应用层DNSHTTP协议HTTP请求响应过程 运输层TCP协议TCP协议面向连接实现TCP的三次握手连接TCP的四次挥手断开连接 TCP协议可靠性实现TCP的流量控制TCP的拥塞控制TCP的重传机制 UDP协议 网际层IP协议&#xff08;主机与主机&#xff09;IP地址的分类…

php 读取文件并以文件方式下载

if (!file_exists($filename)){//判断能否获取这个文件header("Content-type: text/html; charset=utf-8");echo "File not found!";exit

【创作回顾】17个月峥嵘创作史

#里程碑专区#、#创作者纪念日# 还记得 2022 年 10 月 05 日&#xff0c;我在CSDN撰写了第 1 篇博客——《关于测试工程师瓶颈和突围的一个思考》&#xff0c;也是我在全网发布的第一篇技术文章。 回想当时&#xff0c;这一篇的诞生过程并不轻松&#xff0c;不像是一篇网络文章…

【计算机网络】深度学习HTTPS协议

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【计算机网络】深度学习HTTPS协议 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一:HTTPS是什么二:HTTPS的工作过程三:对称加密四:非对称加密五:中间人攻击1…

【web | CTF】BUUCTF [HCTF 2018]WarmUp

天命&#xff1a;这题本地php代码是无法复现的 首先打开网站&#xff0c;啥也没有&#xff0c;查看源码 发现文件&#xff0c;打开访问一下看看&#xff0c;发现是代码审计 <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whit…

【学习总结】什么是DoS和DDoS

[Q&A] 什么是DoS DoS 是 “Denial of Service”&#xff08;拒绝服务&#xff09;的缩写&#xff0c;它是一种网络攻击方式&#xff0c;其目的是使目标计算机或网络资源无法为合法用户提供正常的服务。通过向目标系统发送大量请求、消耗其带宽、处理器或内存等资源&#…

13 双口 RAM IP 核

双口 RAM IP 核简介 双口 RAM IP 核有两个端口&#xff0c;它又分为伪双端口 RAM 和真双端口 RAM&#xff0c;伪双端口 RAM 一个端口只能读&#xff0c;另一个端口只能 写&#xff0c;真双端口 RAM 两个端口都可以进行读写操作。同时对存储器进行读写操作时就会用到双端口 RAM…

unity-1

创建游戏对象&#xff08;游戏物体&#xff09; 可通过unity中的菜单栏中的Gameobject创建&#xff1b;也可在Hierarchy&#xff08;层级&#xff09;中创建&#xff0c; 双击即可居中看到。 在Hierarchy空白处右键即可看到&#xff0c;能创建游戏对象。 在Scene框中&#x…

BioTech - ADMET的性质预测 概述

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/136438192 ADMET&#xff0c;即 Absorption、Distribution、Metabolism、Excretion、Toxicity&#xff0c;吸收、分布、代谢、排泄、毒性…