这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(),但是在创建他们的时候会有初始大小,多少会占用一内存。

相关文章
|
4月前
|
机器学习/深度学习
leetcode:面试题 17.04. 消失的数字(找单身狗/排序/公式)
leetcode:面试题 17.04. 消失的数字(找单身狗/排序/公式)
33 0
|
4月前
|
存储 C语言
牛客网刷题总结(1.有序序列判断,2.获得月份天数,3.矩阵相等判定,4.矩阵转换,5.井字棋判断输赢,6.递归进行进制转化)
牛客网刷题总结(1.有序序列判断,2.获得月份天数,3.矩阵相等判定,4.矩阵转换,5.井字棋判断输赢,6.递归进行进制转化)
63 0
|
11月前
|
API
代码随想录 Day5 哈希表1 T242 相同字母的异序词 T349两个数组的交集 T202 快乐数 T1 两数之和(下)
代码随想录 Day5 哈希表1 T242 相同字母的异序词 T349两个数组的交集 T202 快乐数 T1 两数之和(下)
36 0
|
3月前
【洛谷 P1618】三连击(升级版)题解(循环枚举+全排列)
该编程题目要求将数字1到9分为三组,形成三个三位数,使得这三个数成比例A:B:C。输入为A、B、C的值,输出符合条件的三位数组合,按首个数字升序排列。样例输入为1 2 3,输出多组解。代码使用全排列遍历数字,检查比例关系。若无解,则输出&quot;No!!!&quot;。
18 0
|
10月前
|
存储 算法 Serverless
代码随想录算法训练营第六天 | LeetCode 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
代码随想录算法训练营第六天 | LeetCode 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
65 0
代码随想录算法训练营第六天 | LeetCode 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和
|
11月前
|
Serverless 索引
代码随想录 Day5 哈希表1 T242 相同字母的异序词 T349两个数组的交集 T202 快乐数 T1 两数之和(上)
代码随想录 Day5 哈希表1 T242 相同字母的异序词 T349两个数组的交集 T202 快乐数 T1 两数之和
65 0
|
11月前
|
机器学习/深度学习 存储 前端开发
手撕前端面试题【javascript~ 总成绩排名、子字符串频次统计、继承、判断斐波那契数组等】
在刷题之前先介绍一下牛客。Leetcode有的刷题牛客都有,除此之外牛客里面还有招聘(社招和校招)、一些上岸大厂的大佬的面试经验。 牛客是可以伴随一生的编程软件(完全免费),从学校到社会工作,时时刻刻你都可以用到,感兴趣的可以去注册试试可以伴随一生的刷题app
55 0
|
算法 安全
代码随想录算法训练营第六天| 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
代码随想录算法训练营第六天| 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和
(leecode)错误的集合
将数字大小的位置++,然后遍历每个位置,大小为0的是缺失数字,大小为2的是重复数字
36 0
Python|Leetcode《846》《1296》|一手顺子 划分数组为连续数字的集合
Python|Leetcode《846》《1296》|一手顺子 划分数组为连续数字的集合