【Java面试】List接口

news2024/12/1 0:19:40

文章目录

  • Iterator 和 ListIterator 有什么区别?
  • 遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java中List 遍历的最佳实践是什么?
  • 说一下 ArrayList 的优缺点
  • 如何实现数组和 List 之间的转换?
  • ArrayList 和 LinkedList 的区别是什么?
  • ArrayList 和 Vector 的区别是什么?
  • 插入数据时,ArrayList、LinkedList、Vector谁速度较快?阐述 ArrayList、Vector、LinkedList 的存储性能和特性?
  • 多线程场景下如何使用 ArrayList?
  • 为什么 ArrayList 的 elementData 加上 transient 修饰?
  • List 和 Set 的区别
  • Set篇

Iterator 和 ListIterator 有什么区别?

  • Iterator 可以遍历 Set 和 List 集合,而 ListIterator 只能遍历 List。
  • Iterator 只能单向遍历,而 ListIterator 可以双向遍历(向前/后遍历)。
  • ListIterator 实现 Iterator 接口,然后添加了一些额外的功能,比如添加一个元 素、替换一个元素、获取前面或后面元素的索引位置。

遍历一个 List 有哪些不同的方式?每种方法的实现原理是什么?Java中List 遍历的最佳实践是什么?

遍历方式有以下几种:

  1. for 循环遍历,基于计数器。在集合外部维护一个计数器,然后依次读 取每一个位置的元素,当读取到最后一个元素后停止。
  2. 迭代器遍历,Iterator。Iterator 是面向对象的一个设计模式,目的是屏 蔽不同数据集合的特点,
    统一遍历集合的接口。Java 在 Collections 中支 持了 Iterator 模式。
  3. foreach 循环遍历。foreach 内部也是采用了 Iterator 的方式实现,使 用时不需要显式声明
    Iterator 或计数器。优点是代码简洁,不易出错;缺 点是只能做简单的遍历,不能在遍历过程中操作数据集合,例如删除、替换。

最佳实践:Java Collections 框架中提供了一个 RandomAccess 接口,用来标 记 List 实现是否支持
Random Access。如果一个数据集合实现了该接口,就意味着它支持 Random Access,按位置读 取元素的平均时间复杂度为 O(1),如ArrayList。如果没有实现该接口,表示不支持 Random Access,如LinkedList。 推荐的做法就是,支持Random Access 的列表可用 for 循环遍历,否则建议 用 Iterator 或 foreach 遍历。
例如ArrayList推荐使用for循环遍历,LinkedList推荐使用Iterator或者foreach遍历。
在这里插入图片描述
在这里插入图片描述

说一下 ArrayList 的优缺点

ArrayList的优点如下:

  • ArrayList 底层以数组实现,是一种随机访问模式。ArrayList 实现了 RandomAccess 接口,因此查
    找的时候非常快。
  • ArrayList 在顺序添加一个元素的时候非常方便。

ArrayList 的缺点如下:

  • 删除元素的时候,需要做一次元素复制操作。如果要复制的元素很多,那么就会比较耗费性能。
  • 插入元素的时候,也需要做一次元素复制操作,缺点同上。
    ArrayList 比较适合顺序添加、随机访问的场景。

如何实现数组和 List 之间的转换?

数组转 List:使用 Arrays. asList(array) 进行转换。
List 转数组:使用 List 自带的 toArray() 方法。代码示例:

1 // list to array
2 List<String> list = new ArrayList<String>();
3 list.add("123");
4 list.add("456");
5 list.toArray();
6
7 // array to list
8 String[] array = new String[]{"123","456"};
9 Arrays.asList(array);

ArrayList 和 LinkedList 的区别是什么?

  • 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实
    现。
  • 随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数
    据存储方式,所以需要移动指针从前往后依次查找。
  • 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为
    ArrayList 增删操作要影响数组内的其他数据的下标。所以如果数据插入的位置是中间那么尽可能选择LinkedList,否则ArrayList是最优解。
  • 内存空间占用:LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储
    了两个引用,一个指向前一个元素,一个指向后一个元素。
  • 线程安全:ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;

综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。
补充:数据结构基础之双向链表
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。

ArrayList 和 Vector 的区别是什么?

这两个类都实现了 List 接口(List 接口继承了 Collection 接口),他们都是有序集合。

  • 线程安全:
    Vector 使用了 Synchronized 来实现线程同步,是线程安全的,而ArrayList 是非线程安全的。
  • 性能:ArrayList 在性能方面要优于 Vector。
  • 扩容:ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在Vector 扩容每次会增加 1 倍,而 ArrayList 只会增加 50%。
  • Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。
    Arraylist不是同步的,所以在不需要保证线程安全时时建议使用Arraylist。

插入数据时,ArrayList、LinkedList、Vector谁速度较快?阐述 ArrayList、Vector、LinkedList 的存储性能和特性?

  • 速度:
    ArrayList、Vector 底层的实现都是使用数组方式存储数据。数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。
    而LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但插入数据时只需要记录当前项的前后项即可,所以 LinkedList插入速度较快。

  • 特性:
    Vector 中的方法由于加了 synchronized 修饰,因此 Vector是线程安全容器,但性能上较ArrayList差。
    ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常消耗性能。
    LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引,但是缺点就是查找非常麻烦,要丛第一个索引开始。
    ArrayList和Vector都是用数组方式存储数据,此数组元素数要大于实际的存储空间,以便进行元素增加和插入操作,他们都允许直接用序号索引元素,但是插入数据元素涉及到元素移动等内存操作,所以查询数据快而插入数据慢。
    LinkedList使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,所以查询数据慢,是插入数据时只需要记录前后项即可,所以插入的速度快。

多线程场景下如何使用 ArrayList?

ArrayList 不是线程安全的,如果遇到多线程场景,可以通过 Collections 的synchronizedList 方法将其转换成线程安全的容器后再使用。例如像下面这样:

1 List<String> synchronizedList = Collections.synchronizedList(list);
2 synchronizedList.add("aaa");
3 synchronizedList.add("bbb");
4
5 for (int i = 0; i < synchronizedList.size(); i++) {
6 	System.out.println(synchronizedList.get(i));
7 }

为什么 ArrayList 的 elementData 加上 transient 修饰?

ArrayList 中的数组定义如下:

private transient Object[] elementData;

再看一下 ArrayList 的定义:

public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable

可以看到 ArrayList 实现了 Serializable 接口,这意味着 ArrayList 支持序列化。
transient 的作用是说不希望 elementData 数组被序列化,重写了 writeObject 实现:

1 private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOE
xception{
2 *// Write out element count, and any hidden stuff*
3 int expectedModCount = modCount;
4 s.defaultWriteObject();
5 *// Write out array length*
6 s.writeInt(elementData.length);
7 *// Write out all elements in the proper order.*
8 for (int i=0; i<size; i++)
9 s.writeObject(elementData[i]);
10 if (modCount != expectedModCount) {
11 throw new ConcurrentModificationException();
12 }

每次序列化时,先调用 defaultWriteObject() 方法序列化 ArrayList 中的非transient 元素,然后再遍历
elementData。只序列化已存入的元素,这样既加快了序列化的速度,又减小了序列化之后的文件大
小。

List 和 Set 的区别

List , Set 都是继承自Collection 接口
List 特点:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素,元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。
Set 特点:一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。Set 接口常用实现类是HashSet、LinkedHashSet 以及 TreeSet。

另外 List 支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,
无法用下标来取得想要的值。

Set和List对比
Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。
List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

Set篇

Set篇

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

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

相关文章

M4 tm4c1294单片机软件调式总结

1&#xff0c;框架图&#xff1a; 调式基本方法&#xff1a; &#xff08;1&#xff09;加串口打印初始化&#xff0c;单步跟踪查看&#xff0c;类似gdb的单步&#xff1b; &#xff08;2&#xff09;打印命令行&#xff0c;重点参数添加命令行打印; &#xff08;3&#xff…

Redis 的相关基础知识

【一】 Redis 中默认的端口号为什么是6379 图中的人名为 Alessia Merz &#xff0c;其中的 Merz 对应的九键输入法按出来的就是6379 【二】 Redis 默认的数据库 Redis 中默认使用的是16个数据库&#xff0c;类似数组下标从0开始&#xff0c;初始默认使用0号数据库 【三】 Redis…

vscode搭建Verilog HDL开发环境

工欲善其事&#xff0c;必先利其器。应该没有多少人会使用Quartus和vivado这些软件自带的编辑器吧&#xff0c;原因在于这些编辑器效率很低&#xff0c;Verilog HDL代码格式比较固定&#xff0c;通常可以利用代码片段补全加快书写。基本上代码写完之后才会打开Quartus或者vivad…

一文带你了解Spring中的事务管理

文章目录前言一、事务的基础概念二、spring中事务的使用声明式事务编程式事务如何选择事务方式三、spring中事务管理实现原理前言 本文将涉及以下知识点&#xff1a; 事务的基础概念spring当中事务的使用spring当中事务管理的实现原理 一、事务的基础概念 事务&#xff08;T…

python画图

python画图1.使用matplotlib画图2.使用pyecharts画图2.x pyecharts的三种图片渲染工具2.x.1 snapshot_selenium2.x.2 snapshot_phantomjs2.x.3 snapshot_pyppeteer1.使用matplotlib画图 2.使用pyecharts画图 pyecharts是一款将python与echarts结合的强大的数据可视化工具&…

阿里云服务器安装tomcat

一、前置条件 安装tomcat需要先安装jdk&#xff0c;所以没有安装jdk同学&#xff0c;详见参考文章或者此文章 二、Linux上安装tomcat 1. 下载Apache tomcat tomcat官网下载地址 在左边&#xff0c;可以选择下载各种版本的tomcat。根据服务器操作系统选择下载。Linux操作系统…

第七章TCP/IP——ARP网络攻击与欺骗

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。个人爱好: 编程&#xff0c;打篮球&#xff0c;计算机知识个人名言&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石…

分布式文件系统和对象存储魔力象限,右上角都有谁?

自Gartner 首次发布      分布式文件系统和      对象存储魔力象限以来      戴尔科技集团      就牢牢位居领导者象限      今年也不例外      恭喜      连续第七年获评领导者!    对于入选本年度的魔力象限领导者,我们感到十分荣幸。我们相…

docker安装jenkins最新版

前言 使用的是centos7的linux系统&#xff0c; 检查docker 是否开启网络 如果没有开启网络会报错:WARNING: IPv4 forwarding is disabled. Networking will not work. 检查网络状态 sysctl net.ipv4.ip_forward如果返回为“net.ipv4.ip_forward 1”则表示网络转发正常&am…

1534_TriCore编译器Tasking使用_汇编语言语法以及标识符

全部学习汇总&#xff1a; GreyZhang/TriCore_Tasking_Compiler_Skills: Some skills for Tasking compiler on AURIX platform. Happy hacking! (github.com) 1. 如同C语言&#xff0c;汇编语言也可以续行而且采用了同样的续行符号。不过&#xff0c;我遇到的汇编一直都是很统…

TMS Echo数据复制的Delphi框架

TMS Echo数据复制的Delphi框架 TMS Echo是用于数据复制的Delphi框架。它是TMS Business产品阵容的一部分&#xff0c;它取决于TMS Aurelius的运营。 TMS Echo允许您至少拥有两个数据库并在它们之间同步信息。您对单个客户数据库所做的更改(插入、更新、删除)可能会传输到其他数…

PowerMax——业界首个引入NVIDIA BlueField DPU的高端存储

高性能、可扩展、弹性与空间 全球越来越多的领先企业 都依靠关键任务型存储 承载企业核心业务 DPU作为一个新兴起的概念,正在以惊人的速度崛起。据预测,DPU将成为未来计算的三大支柱之一,CPUGPUDPU构成未来的数据中心。 现在,全球首款 集成NVIDIA BlueField DPU技术的 关…

QMudiaPlayer(状态)

在音乐播放中介绍了QMediaPlayer的基本用法&#xff0c;在这里更深度的使用QMediaPlayer。 媒体播放器的当前媒体的状态&#xff1a; QMediaPalyer&#xff1a;&#xff1a;MediaStatus 会发射 mediaStatusChanged&#xff08;&#xff09;信号 QMediaPlayer::UnknownMediaSt…

数据库、计算机网络,操作系统刷题笔记3

数据库、计算机网络&#xff0c;操作系统刷题笔记3 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&…

精度和召回率的区别

先弄懂TP、FP、FN、TN T:ture 这件事是做对了 F:false 这件事做错了 N:negtive 负类 P:positive 正类TP:正确的把它判断成正例了 FP&#xff1a;错误的把它判断成正例了 FN&#xff1a;错误的把它判断成负例了 它本身是正例&#xff0c;把它判断成负例&#xff0c;为0个 TN…

[附源码]Python计算机毕业设计电影院订票系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

grafana 画富集多个指标 label 的表格

下午5点&#xff1a;老哥&#xff0c;今天把业务趋势图搞出来吧。 一、怎么画表格 我们的需要是做下面的视图&#xff0c;他是一个表格&#xff0c;而且有着多个数据源 添加图表 填入数据&#xff0c;展示原始图形 转换为 table 只显示最新一条 选择查询条件的 instant…

【前端】CSS

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言一、【基本语法规范】二、【CSS引入方式】三、【代码风格】四、【CSS选择器】1. 基础选择器2. 复合选择器五、【CSS常用元素属性】1. 【字体相关属性】2. 【文本属性】3. 【背景属性】4. 【圆角矩形】5. 【调试】…

C++回顾从入门开始

前言 新手搭配视频 回顾复习直接看 有问题请评论提出看到会及时修改 include、iostream、main() #include <iostream> using namespace std; int main() {cout << "Hello World!" << endl;return 0; } 解释 int表示函数的返回值类型&#xff0c…

GAMES202 Real-time Environment Mapping

文章目录前言Lecture5 Real-time Environment Mapping (prefiltering&#xff0c;split sum)补充&#xff1a;反射波瓣&#xff08;Lobe&#xff09;Lecture6 Real-time Environment Mapping (precomputed radiance transfer)Spherical Harmonicsprecomputed radiance transfer…