1.什么时候使用?
本质上是一个数组。 可以通过索引直接访问其元素。 但是,如果数组已满,则需要分配一个更大的新数组,并且将所有元素移动到新数组将花费 O(n) 时间。 此外,添加或删除元素需要移动数组中的现有元素。 这可能是使用时最大的缺点。
它是一个双向链表。 因此,要访问中间的元素,必须从列表的开头开始搜索。 另一方面,添加和删除元素速度更快,因为只需要更改节点之间的引用关系。
比较两者在最坏情况下的时间复杂度
方法
获取(索引)
复杂度(1)
在)
添加(E)
在)
复杂度(1)
添加(E,索引)
在)
在)
(指数)
在)
在)
.()
在)
复杂度(1)
.add(E)
在)
复杂度(1)
比较速度是一回事,但对于大型列表,我们还必须考虑内存使用情况。 在 中,每个节点至少需要两个额外的指针来链接前一个和后一个节点。 而在 中,只需要一个元素数组。
总而言之,当选择在项目中使用哪一个时,您心中已经有了答案。
2.集合遍历时如何删除元素
这个就不用我说了。 大家在面试的时候应该都有过这样的经历。 遍历和修改集合的唯一正确方法是使用 .()。 例如:
Iterator itr = list.iterator();
while(itr.hasNext()) {
// do something
itr.remove();
}
有时候我们很容易写出如下错误代码
首先:
for(Integer i: list) {
list.remove(i);
}
如果运行此代码,将抛出 java.util.。 在 Java 中,“通常不允许一个线程修改集合,而另一个线程正在迭代它。”
第二种:
for (int i = 0; i < list.size(); i++) {
list.remove(list.get(i));
}
如果运行这段代码,不会报错,但永远不会得到你想要的结果。
3.如何将int[]转换为List?
是不是很简单
List<int> list = Arrays.asList(array);
或
List list = Arrays.asList(array);
你确定你的编译器不会报告错误吗? O(∩_∩)O哈哈~正确的做法有两种。 第一个是介绍Lang包
org.apache.commons
commons-lang3
3.11
List list = Arrays.asList(ArrayUtils.toObject(array));
另一种方法是循环遍历它。
int[] array = {1,2,3,4,5};
List list = new ArrayList();
for(int i: array) {
list.add(i);
}
4. 如何去除其中的重复元素?
遇到这个问题的时候,有的同学会想到遍历,但是为什么不想想其他的方法呢? 例如,Set 是不重复的。 我们可以直接将元素放入Set中,过滤它们,然后将它们放回去。
ArrayList** list = ... // initial a list with duplicate elements
Set set = new HashSet(list);
list.clear();
list.addAll(set);
5..()你用过吗? 它有什么作用?
首先我们先来说一下(),我们看一下源码
@SuppressWarnings("rawtypes")
public static final List EMPTY_LIST = new EmptyList<>();
@SuppressWarnings("unchecked")
public static final List emptyList() {
return (List) EMPTY_LIST;
}
可以看出,它是一个不可变的列表。 此外,每次调用都不会创建空列表的新实例。 如果你熟悉设计模式,你应该明白我的意思。 因此,如果频繁调用,这将为您提供更好的性能。
那么我们需要他做什么呢?
例如,方法返回一个列表。 当没有结果时,返回null。 当有结果时,它返回一个列表。 此时,调用端需要进行空判断。 使用该方法可以方便方法调用者。 你可能会说直接 new()或者new(),但是它们创建的时候会有一个初始大小,并且会占用一些内存。
长按识别
如果您喜欢,请在离开前点击观看。