这5个集合方面的问题,你都能答对吗?

简介: 这5个集合方面的问题,你都能答对吗?

640.jpg

1.何时在ArrayList上使用LinkedList?

ArrayList本质上是一个数组。它的元素可以通过索引直接访问。但是,如果数组已满,则需要一个更大的新数组来分配,并将所有元素移动到新数组将花费O(n)时间。另外,添加或删除元素都需要移动数组中的现有元素。这可能是使用ArrayList的最大缺点。

LinkedList是一个双链表。因此,要访问中间的元素,必须从列表的开头进行搜索。而另一方面,在LinkedList中添加和删除元素的速度更快,因为LinkedList只需改变节点之间的引用关系。

以最坏的情况下来比较两个的时间复杂度

   方法         | Arraylist | LinkedList
get(index) O(1) O(n)
 add(E)       |   O(n)    |    O(1)   

add(E, index) | O(n) | O(n)
remove(index) | O(n) | O(n)
Iterator.remove() | O(n) | O(1)
Iterator.add(E) | O(n) | O(1)

比较速度是一方面,但是对于大型列表,我们也要考虑内存使用情况。在LinkedList中,每个节点至少需要两个额外的指针才能链接上一个和下一个节点。而在ArrayList中,仅需要一个元素数组。

综上在项目中选择使用哪个心里是不是已经有了答案。

2.集合如何在遍历时删除元素

这个不用我说,各位面试应该都经历过吧,在遍历修改集合的唯一正确方法是使用 Iterator.remove()。 例如:

Iterator<Integer> itr = list.iterator();  
while(itr.hasNext()) {  
// do something  
   itr.remove();  
}

有时候我们很容易写出下面的错误代码

第一种:

for(Integer i: list) {  list.remove(i);}

如果你运行了此代码的话,则会抛出一个java.util.ConcurrentModificationException异常,在Java中,“通常不允许一个线程修改集合,而另一个线程在其上进行迭代。”

第二种:

for (int i = 0; i < list.size(); i++) {    list.remove(list.get(i));}

如果你运行了此代码的话,确实不会报错,但是你总是得不到你想要的结果。

3.如何将int[]转换为List?

是不是很简单

List<int> list = Arrays.asList(array);或List<Integer> list = Arrays.asList(array);

这样你确定你的编译器不报错?O(∩_∩)O哈哈~ 正确的做法是有两种,第一种引入 Apache Commons Lang包

<dependency>  <groupId>org.apache.commons</groupId>  <artifactId>commons-lang3</artifactId>  <version>3.11</version></dependency>
List<Integer> list = Arrays.asList(ArrayUtils.toObject(array));

另一种就是循环遍历喽

int[] array = {1,2,3,4,5};List<Integer> list = new ArrayList<Integer>();for(int i: array) {  list.add(i);}

4.如何从ArrayList中删除重复的元素?

遇到这个问题,有的同学会想到遍历,但是为什么不想想其它的方法呢,比如Set就是不重复的啊,我们把元素直接放到Set里面过滤一遍,再放回去不就好了。

ArrayList** list = ... // initial a list with duplicate elementsSet<Integer> set = new HashSet<Integer>(list);list.clear();list.addAll(set);

5.Collections.emptyList()你用过吗?它的作用是干嘛的?

首先我们先来说说Collections.emptyList(),我们看源码

@SuppressWarnings("rawtypes")public static final List EMPTY_LIST = new EmptyList<>();@SuppressWarnings("unchecked")public static final <T> List<T> emptyList() {    return (List<T>) EMPTY_LIST;}

可知它一个不可变的列表。并且,每次调用不会创建一个空列表的新实例。如果您对设计模式熟悉的Singleton,您应该知道我的意思。因此,如果经常调用,这将为您提供更好的性能。

那我们要他有什么用呢?

比如说一个方法返回一个List,当没有任何结果的时候,返回null,有结果的时候,返回列表。那样的话,调用端就需要进行null判断,使用emptyList这样的方法,可以方便方法调用者。你可能说直接返回new ArrayList() 或者 new LinkedList(),但是在创建他们的时候会有初始大小,多少会占用一内存。

相关文章
Springboot之Thymeleaf 表单提交
Springboot之Thymeleaf 表单提交
682 0
|
Python
用python3快速读取30G+的txt文件
这篇文章介绍了如何使用Python分块读取大文件(如30G+的txt文件),通过设置每次读取的块大小来处理大型文本文件,以减少内存消耗并提高处理效率。
303 14
|
7月前
|
C# 图形学
unity抛物线的制作
该教程展示了如何在Unity中使用LineRenderer组件和C#脚本绘制抛物线。具体步骤如下:创建一个空物体并添加LineRenderer组件,挂载提供的`SeletParabola`脚本;新建两个Cube作为起点和终点,并将其拖到脚本对应的公共变量上。运行后即可看到从起点到终点的抛物线效果。代码通过计算抛物线上的点并设置给LineRenderer来实现这一效果。此外,还可以为LineRenderer添加贴图以增强视觉效果。
|
11月前
|
编译器 C语言
C语言:普通全局变量可以被多个源文件共享吗
C语言中,普通全局变量可以通过extern关键字在多个源文件中声明和共享,实现数据的跨文件使用。但需注意,变量只能在一个文件中定义,其他文件中仅能声明。
434 9
|
数据采集
多线程在编程中的重要性有什么?并以LabVIEW为例进行说明
多线程在编程中的重要性有什么?并以LabVIEW为例进行说明
158 4
|
敏捷开发 持续交付 项目管理
阿里云云效产品使用问题之项目管理内,任务如何关联到需求上
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
弹性计算 Shell KVM
快速克隆KVM 虚拟机
【4月更文挑战第29天】
151 3
|
算法 Python
Python每日一练——第3天:三种猜数字小游戏
Python每日一练——第3天:三种猜数字小游戏
1001 15
|
前端开发 Java 测试技术
Dinky 打包分析(进一步了解maven)
Dinky 打包分析(进一步了解maven)
333 0
|
开发框架 JavaScript 小程序
多端/跨端/融合的移动端/小程序之uni-app
Uni-app 是一种非常重要的移动端开发框架,因为它可以让开发者在不同的平台上进行开发,并且提供了跨平台的可移植性。
327 1

热门文章

最新文章