Java List——针对实习面试

目录

  • Java List
    • Java List的三种主要实现是什么?它们各自的特点是什么?
    • Java List和Array(数组)的区别?
    • Java List和Set有什么区别?
    • ArrayList和Vector有什么区别?
    • 什么是LinkedList?它与ArryList有什么区别?
    • 什么是ArrayList扩容机制?

Java List

在这里插入图片描述

Java List的三种主要实现是什么?它们各自的特点是什么?

Java中List接口的三种主要实现分别是ArrayListLinkedListVector。它们各自的特点如下:

  1. ArrayList
  • 基于动态数组ArrayList内部使用数组来存储元素,这使得随机访问元素非常快速(时间复杂度为O(1))。
  • 非同步ArrayList不是线程安全的,因此在多线程环境中需要外部同步措施
  • 快速失败迭代器ArrayList的迭代器在迭代过程中,如果检测到集合结构被修改,会立即抛出ConcurrentModificationException
  • 适合随机访问:如果你需要频繁地读取列表中的元素并且不需要经常插入或删除元素,那么ArrayList是最佳选择。
  1. LinkedList
  • 基于双向链表LinkedList内部使用链表来存储元素,每个元素都包含对前一个和后一个元素的引用。
  • 非同步:和ArrayList一样,LinkedList也不是线程安全的。
  • 适合插入和删除操作:由于链表的结构,LinkedList在插入和删除元素时(特别是在列表的开头或中间)不需要移动其他元素,因此操作速度快(时间复杂度为O(1))。
  • 不支持快速随机访问:与ArrayList不同,LinkedList不支持快速随机访问,访问特定索引的元素需要从头开始遍历链表。
  1. Vector
  • 基于动态数组VectorArrayList类似,也是基于数组实现的,但它提供了线程安全的操作。
  • 同步Vector的所有方法都是同步的,这意味着它是线程安全的,但这也导致了性能上的开销。
  • 快速失败迭代器:与ArrayList类似,Vector的迭代器在检测到并发修改时也会抛出ConcurrentModificationException
  • 已过时:由于性能问题,Vector类已被官方标记为过时(deprecated),建议使用Collections.synchronizedList包装ArrayList来获得更好的性能。

在选择List的实现时,你应该根据你的具体需求来决定。如果你需要频繁地访问列表中的元素,并且不需要经常插入或删除元素,那么ArrayList是一个好的选择。如果你需要在列表中频繁地插入或删除元素,尤其是在列表的开头或中间,那么LinkedList可能更合适。如果你需要一个线程安全的列表,并且不关心性能,那么Vector可以满足你的需求,但通常推荐使用Collections.synchronizedList来包装ArrayList

Java List和Array(数组)的区别?

Java中List接口和数组(Array)在功能和使用上有一些关键的区别。以下是List和数组的主要区别:

  1. 类型和大小
  • 数组:在Java中,数组是固定大小的,一旦声明,其长度不能改变。数组可以存储基本数据类型和对象。
  • ListList是一个接口,其大小可以动态增长和缩减。List可以存储对象,但不支持基本数据类型。
  1. 实现
  • 数组:数组是Java的一种基本数据结构,用于存储固定大小的同类型元素。
  • ListList是一个接口,有多个实现类,如ArrayListLinkedList等,这些实现类提供了不同的存储和访问方式。
  1. 性能
  • 数组:对于基本数据类型数组,访问和赋值操作通常比List快,因为数组是连续内存存储。
  • List:对于对象,List(特别是ArrayList)提供了更多的灵活性和功能,如动态扩容、添加、删除元素等,但可能在性能上不如数组。
  1. 功能
  • 数组:数组提供基本的元素访问,但不支持List提供的一些高级操作,如addAll()removeAll()iterator()等。
  • ListList接口提供了丰富的操作方法,如add()remove()contains()iterator()等,以及Collections类提供的静态方法,如sort()binarySearch()等。
  1. 泛型
  • 数组:数组在声明时就需要指定其类型,且这个类型在数组的生命周期内不能改变。
  • ListList可以使用泛型来指定存储的元素类型,这使得List更加灵活和安全。
  1. 多维数组
  • 数组:可以创建多维数组,如int[][]
  • List:虽然List本身不支持多维,但可以通过创建ListList来实现类似多维数组的功能。
  1. 序列化
  • 数组:数组可以很容易地序列化和反序列化。
  • ListList的序列化和反序列化需要额外的处理,如使用ArrayListwriteObject()readObject()方法。
  1. 初始值
  • 数组:数组的元素在创建时可以有默认值,例如,整数数组的元素默认为0。
  • ListList的元素在创建时默认值为null
  1. 线程安全
  • 数组:数组不是线程安全的。
  • ListList的实现类,如Vector,是线程安全的,但通常推荐使用Collections.synchronizedList来包装非线程安全的List
  1. 可变性
  • 数组:数组一旦创建,其大小和内容都不可变(除非重新创建一个新的数组)。
  • ListList的大小和内容都是可变的,可以通过添加、删除元素来改变。

在面试中,理解这些区别可以帮助你根据具体需求选择使用数组还是List,并能够解释为什么在某些情况下一个比另一个更合适。

Java List和Set有什么区别?

Java中的ListSet是集合框架中的两个接口,它们有以下主要区别:

  1. 元素唯一性
  • List:允许重复元素,即同一个列表中可以包含多个相同的对象。
  • Set:不允许重复元素,如果尝试添加重复的元素,它将被忽略或替换。
  1. 元素顺序
  • List:通常是有序的,即元素的顺序是按照它们被添加的顺序保存的。
  • Set:通常是无序的,即不保证元素的顺序。
  1. 实现类
  • List:常见的实现类有ArrayListLinkedListVector
  • Set:常见的实现类有HashSetLinkedHashSetTreeSet
  1. 性能
  • List:对于添加、删除和查找操作,性能可能因实现而异。例如,ArrayList在随机访问时非常高效,但在中间或开始处插入和删除元素时可能需要移动元素,效率较低。LinkedList在插入和删除操作时效率较高,但在随机访问时效率较低。
  • Set:对于添加、删除和查找操作,性能也取决于实现。例如,HashSet提供了非常快的平均时间复杂度,特别是对于添加和删除操作,但在迭代时可能不如TreeSet快。TreeSet保持元素有序,因此插入和查找操作通常较慢。
  1. 迭代器
  • List:返回的迭代器是快速失败的,即如果在迭代过程中修改了列表(除了通过迭代器自己的remove方法),将抛出ConcurrentModificationException
  • Set:返回的迭代器也是快速失败的。
  1. 应用场景
  • List:当你需要保持元素顺序,或者需要频繁访问列表中的元素时,使用List
  • Set:当你需要确保元素唯一性,或者不关心元素的顺序时,使用Set
  1. 方法
  • List:提供了一些特有的方法,如get(int index)set(int index, E element)add(int index, E element)remove(int index)
  • Set:没有提供额外的索引相关的方法,因为它不支持有序性。
  1. 线程安全
  • ListVector是线程安全的,但通常推荐使用Collections.synchronizedList来包装非线程安全的List
  • SetCollections.synchronizedSet可以用来包装非线程安全的Set,如HashSet

在面试中,理解ListSet的区别对于选择合适的集合类型非常重要。面试官可能会询问你如何在它们之间做出选择,或者如何使用它们的特性来解决特定的问题。

ArrayList和Vector有什么区别?

ArrayListVector都是Java集合框架中用于存储动态数组的类,但它们之间存在一些关键区别:

  1. 线程安全性
  • ArrayList:不是线程安全的,因此在多线程环境中需要外部同步措施来保证线程安全。
  • Vector:是线程安全的,内部方法都是同步的,不需要额外的同步措施。
  1. 性能
  • ArrayList:由于不是线程安全的,通常比Vector有更好的性能,尤其是在单线程环境中。
  • Vector:由于所有操作都是同步的,所以性能通常比ArrayList差,尤其是在多线程环境中。
  1. 扩容机制
  • ArrayList:在内部使用数组来存储元素,当元素数量超过当前数组容量时,会进行数组扩容,通常是创建一个新的更大的数组,并将旧数组的元素复制到新数组中。
  • Vector:同样使用数组来存储元素,但扩容机制与ArrayList不同。Vector的扩容因子默认为2,即每次扩容都会将容量增加到原来的两倍,这可能导致比ArrayList更大的内存占用。
  1. 已被弃用
  • ArrayList:是推荐使用的集合类,因为它是非线程安全的,所以在单线程环境中性能更好。
  • Vector:由于性能问题,已经被官方标记为过时(deprecated),不推荐使用。如果需要线程安全的集合,建议使用Collections.synchronizedList来包装ArrayList
  1. 继承结构
  • ArrayListVector都实现了List接口,但Vector继承自AbstractList,而ArrayList继承自AbstractList的子类AbstractSequentialList
  1. 默认容量
  • ArrayList:默认初始容量为10(可以通过构造函数设置初始容量)。
  • Vector:默认初始容量也为10(也可以通过构造函数设置)。
  1. 迭代器
  • ArrayListVector:它们的迭代器都是快速失败的,即如果在迭代过程中修改了集合(除了通过迭代器自己的removeadd方法),将抛出ConcurrentModificationException

在面试中,你可能会被问到如何选择使用ArrayListVector,或者如何在ArrayListVector之间进行转换。理解这些区别可以帮助你根据具体需求选择最合适的集合类型。

什么是LinkedList?它与ArryList有什么区别?

LinkedList 是 Java 集合框架中的一个类,它实现了 List 接口。LinkedList 是基于双向链表实现的,每个元素都包含了对前一个和后一个元素的引用。以下是 LinkedList 的一些关键特性以及与 ArrayList 的主要区别:

LinkedList 的特性:

  1. 基于链表实现LinkedList 的内部使用链表结构来存储元素,每个元素都包含对前一个和后一个元素的引用。
  2. 非同步LinkedList 不是线程安全的,因此在多线程环境中需要外部同步措施。
  3. 快速插入和删除:由于链表的结构,LinkedList 在插入和删除元素时(特别是在列表的开头或中间)不需要移动其他元素,因此操作速度快(时间复杂度为 O(1))。
  4. 不支持快速随机访问:与 ArrayList 不同,LinkedList 不支持快速随机访问,访问特定索引的元素需要从头开始遍历链表。
  5. 可以当作队列或栈使用LinkedList 实现了 Deque 接口,因此它可以被用作队列或栈。

ArrayList 的特性:

  1. 基于动态数组实现ArrayList 内部使用数组来存储元素,这使得随机访问元素非常快速(时间复杂度为 O(1))。
  2. 非同步ArrayList 不是线程安全的,因此在多线程环境中需要外部同步措施。
  3. 快速随机访问:由于数组的结构,ArrayList 支持快速的随机访问。
  4. 插入和删除操作可能较慢:在 ArrayList 中插入和删除元素可能需要移动其他元素,特别是在列表的中间位置,这可能导致较慢的操作(时间复杂度为 O(n))。

主要区别:

  1. 内部数据结构ArrayList 使用动态数组,而 LinkedList 使用双向链表。
  2. 随机访问性能ArrayList 支持快速的随机访问,而 LinkedList 不支持。
  3. 插入和删除性能LinkedList 在插入和删除操作上通常比 ArrayList 快,特别是在列表的开头或中间。
  4. 内存占用LinkedList 的每个元素都需要额外的内存来存储前后元素的引用,因此可能比 ArrayList 占用更多内存。
  5. 功能实现LinkedList 实现了 Deque 接口,提供了队列、栈等数据结构的操作,而 ArrayList 没有实现这些接口。
  6. 迭代器性能LinkedList 的迭代器在列表中间插入或删除元素时,不需要像 ArrayList 那样移动后续元素,因此在某些操作中可能更快。

在面试中,你可能会被问到如何选择使用 ArrayListLinkedList,这取决于你的具体需求,例如是否需要频繁的随机访问,或者是否需要频繁的插入和删除操作。

什么是ArrayList扩容机制?

ArrayList 是 Java 集合框架中的一部分,它实现了一个可以动态增长和缩减的索引序列。ArrayList 内部使用数组来存储元素,当列表的当前容量不足以容纳更多元素时,ArrayList 需要扩容以确保可以添加新元素。ArrayList 的扩容机制如下:

初始容量

  • 当创建一个 ArrayList 实例时,它有一个初始容量(默认通常是10,但也可以指定其他值)。这个容量是指内部数组的初始大小。

扩容过程

  1. 添加元素:当使用 add() 方法添加元素时,ArrayList 会检查内部数组是否还有空间容纳新元素。
  2. 检查容量:如果数组已满,ArrayList 会创建一个新的、容量更大的数组。
  3. 扩容策略:新数组的容量通常是旧数组容量的1.5倍(或者通过构造函数指定的增长因子),但这不是固定的,具体实现可能会有所不同。
  4. 元素复制ArrayList 会将旧数组中的所有元素复制到新数组中。
  5. 引用更新:一旦所有元素都被复制,旧数组会被丢弃,内部引用指向新数组。

影响性能

  • 性能开销:扩容操作涉及到创建新数组和复制旧数组中的元素,这可能会带来显著的性能开销,尤其是在数组较大时。
  • 频繁操作:如果 ArrayList 需要频繁扩容(例如,在循环中添加大量元素),这可能会导致性能问题。为了避免这种情况,一种常见的做法是在添加大量元素之前预先设置一个足够大的容量。

示例代码
以下是一个简单的示例,展示了 ArrayList 扩容的过程:

import java.util.ArrayList;public class ArrayListExample {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();System.out.println("Initial capacity: " + list.size());// 添加元素直到需要扩容for (int i = 0; i < 15; i++) {list.add("Element " + i);}System.out.println("New capacity after resizing: " + list.size());}
}

在这个例子中,当添加第11个元素时,ArrayList 将扩容到至少容纳15个元素的容量。

在面试中,了解 ArrayList 的扩容机制对于编写高效的代码非常重要,特别是在处理大量数据时。面试官可能会询问你如何在添加元素时优化 ArrayList 的性能,或者如何预测和避免频繁的扩容操作。

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

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

相关文章

如何在Linux系统中安装微信

官方版微信的安装 好消息是&#xff0c;现在微信已经发布了官方的Linux版本&#xff0c;大家可以直接通过官方网站下载并安装&#xff0c;避免了以前繁琐的第三方工具安装步骤。 1.1 下载官方版微信 微信&#xff0c;是一个生活方式 选择Linux-> X86 1.2 安装微信 提前…

java双向链表解析实现双向链表的创建含代码

双向链表 一.双向链表二.创建MyListCode类实现双向链表创建一.AddFirst创建&#xff08;头插法&#xff09;二.AddLast创建&#xff08;尾叉法&#xff09;三.size四.remove(指定任意节点的首位删除)五.removeAll(包含任意属性值的所有删除)六.AddIndex(给任意位置添加一个节点…

hhdb数据库介绍(2-2)

数据高可用服务 HHDB Server在计算节点、数据节点、配置库等层次提供全面的高可用保障。提供完善的心跳检测、故障切换对存储节点同步追平判断、全局自增序列在故障时自动跳号、客户端连接Hold等机制&#xff0c;保障数据服务的可用性与数据的一致性。 计算节点服务高可用 H…

精挑细选的100道软测高频面试题,面试前你肯定用得上

测试技术面试题 1、什么是兼容性测试&#xff1f;兼容性测试侧重哪些方面&#xff1f; 2、我现在有个程序&#xff0c;发现在 Windows 上运行得很慢&#xff0c;怎么判别是程序存在问题还是软硬件系统存在问题&#xff1f; 3、测试的策略有哪些&#xff1f; 4、正交表测试用…

STM32获取SHT3X温湿度芯片数据

目录 一、概述 二、单次数据采集模式的测量 1、配置说明 2、代码实现方式 三、周期性数据采集模式的测量 1、配置说明 2、代码实现方式 四、完整代码下载链接 一、概述 SHT3X是Sensirion公司推出的一款高精度、完全校准的温湿度传感器&#xff0c;基于CMOSens技术。它提…

[原创]手把手教学之前端0基础到就业——day11( Javascript )

文章目录 day11(Javascript)01Javascript①Javascript是什么②JavaScript组成③ Javascript的书写位置1. 行内式 (不推荐)2 . 内部位置使用 ( 内嵌式 )3. 外部位置使用 ( 外链式 ) 02变量1. 什么是变量2. 定义变量及赋值3. 注意事项4. 命名规范 03输入和输出1) 输出形式12) 输出…

[JAVAEE] 面试题(五) - HashMap, Hashtable, ConcurrentHashMap

目录 一. Hashtable1.1 Hashtable效率低下的原因: 二. ConcurrentHashMap2.1 ConcurrentHashMap更高效的原因: 三. HashMap, Hashtable, ConcurrentHashMap 之间的区别 HashMap是线程不安全的. 在多线程环境下, 使用: HashtableConcurrentHashMap 来确保线程安全. 一. Hashta…

Vue 2 —Vue Router 页面导航和参数传递

当从A页面跳转到B页面的时候把数据也一起传递过去&#xff0c;可用Vue Router 功能&#xff1a; 一、. this.$router.push 方法 Vue Router 是 Vue.js 的官方路由管理器&#xff0c;允许你在应用中进行页面导航&#xff08;即跳转到不同的 URL 路径&#xff09;。 this.$rout…

Local Transfer 致力于更加便捷地共享传输文件

软件主页&#xff1a;https://illusionna.github.io/LocalTransfer

[AcWing算法基础课]动态规划之01背包

题目链接&#xff1a;01背包 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi&#xff0c;价值是 wi。求解将哪些物品装入背包&#xff0c;可使这些物品的总体积不超过背包容量&#xff0c;且总价值最大。输出最大价值。 首先&#xff0c;我们…

标准、高效的管理测试用例和活动

送您一份新人礼&#xff0c;自动化测试平台限时免费体验~ 本文主要介绍测试用例管理的基础知识和基本使用方法&#xff0c;帮助您快速管理测试用例及活动。 操作流程 用例管理的主要使用流程如下&#xff1a; 1.新建测试用例 2.评审测试用例 3.创建测试计划 4.执行测试计划 5…

如何在jupyter notebook切换python环境

目录 1、切换到目标python环境&#xff0c;假设我的是叫“tf” C:\Users\hello>activate tf(tf) C:\Users\hello>2、安装notebook内核包 (tf) C:\Users\hello>pip install ipykernel3、将环境加入到notebook中 python -m ipykernel install --user --name pytorch --…

windows工具 -- 使用SpaceSniffer查看哪些文件夹占用那么大空间, 再也不用右键属性了

目的 C盘不知道哪些文件夹占用了那么多空间, 右键属性扫描太慢了 效果 运行效果 静态截图 下载使用 下载 SpaceSniffer https://github.com/redtrillix/SpaceSniffer/releases 解压到文件夹后, 双击运行

[DEBUG] 服务器 CORS 已经允许所有源,仍然有 304 的跨域问题

背景 今天有一台服务器到期了&#xff0c;准备把后端迁移到另一台服务器上&#xff0c;结果前端在测试的时候&#xff0c;出现了 304 的跨域问题。 调试过程中出现的问题&#xff0c;包括但不限于&#xff1a; set the request’s mode to ‘no-cors’Redirect is not allow…

智慧园区解决方案:科技赋能,打造未来管理新典范

智慧园区作为城市发展的重要组成部分&#xff0c;正以前所未有的速度蓬勃发展。随着5G、云计算、大数据、物联网&#xff08;IoT&#xff09;、BIM&#xff08;建筑信息模型&#xff09;、人工智能&#xff08;AI&#xff09;及区块链等前沿技术的日益成熟与融合应用&#xff0…

CTF记录

1. [SWPUCTF 2022 新生赛]android 用jadx打开&#xff0c;然后搜索NSS关键字 NSSCTF{a_simple_Android} 2. [SWPU 2024 新生引导]ez_SSTI 模板注入题目&#xff0c;直接焚靖可以秒了 填入数据 ls / 然后 cat /flag即可 获取成功 NSSCTF{2111e7ad-97c5-40d5-9a3b-a2f657bd45e8…

Vue使用富文本编辑器vue-quill-editor

Vue使用富文本编辑器 1. 安装 npm install vue-quill-editor -S2. 引入到项目中 有两种挂载方式&#xff1a; 全局挂载 和 在组件中挂载&#xff0c;根据自己的项目需求选择&#xff0c;一般用到富文本编辑都是在某一个项目中&#xff0c;我们这里为了方便大家选择&#xff…

AUTOSAR_EXP_ARAComAPI的7章笔记(2)

☞返回总目录 相关总结&#xff1a;服务发现实现策略总结 7.2 服务发现的实现策略 如前面章节所述&#xff0c;ara::com 期望产品供应商实现服务发现的功能。服务发现功能基本上是在 API 级别通过 FindService、OfferService 和 StopOfferService 方法定义的&#xff0c;协议…

windows yolo11 自定义训练

一、在yolo11源码文件夹创建一个train.py 内容如下&#xff1a; from ultralytics import YOLOif __name__ __main__:model YOLO(rultralytics/cfg/models/11/yolo11.yaml)model.train(datarD:/yolo11/WiderPerson_yolo/WiderPerson_yolo/WiderPerson_yolo.yaml,imgsz(640,3…

简述 synchronized 和 java.util.concurrent.locks.Lock 的异同?

大家好&#xff0c;我是锋哥。今天分享关于【简述 synchronized 和 java.util.concurrent.locks.Lock 的异同&#xff1f;】面试题。希望对大家有帮助&#xff1b; 简述 synchronized 和 java.util.concurrent.locks.Lock 的异同&#xff1f; 在Java编程中&#xff0c;synchro…