我一直只是一个人使用:
List<String> names = new ArrayList<>();
Run Code Online (Sandbox Code Playgroud)
我使用接口作为可移植性的类型名称,因此当我问这些问题时,我可以重新编写代码.
何时应该LinkedList使用,ArrayList反之亦然?
- LinkedList和之间有什么区别ArrayList?什么时候最好使用LinkedList?
我认为每个Java开发人员至少在面试时都听过一次这个问题.
- 如果您希望能够在列表中间插入项目,则最好使用链接列表.
这是这个问题的常见答案.大家都知道.每当你问一个关于List实现之间差异的问题时,你会得到如下答案:
我什么时候应该使用LinkedList?什么时候需要在元素之间或开始时有效删除?
忘了提到插入费用.在LinkedList中,一旦你有正确的位置,插入成本
O(1),而在ArrayList中它会上升到O(n)- 必须移动经过插入点的所有元素.
当您希望能够在列表中间插入项目(例如优先级队列)时,链接列表优于数组.
ArrayList较慢,因为它需要复制部分数组才能删除已经空闲的插槽.LinkedList只需要操作几个引用.
和更多...
但你有没有试过自己重现它?我昨天试过并得到了这些结果:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Test {
public static void main(String... args) {
final int MAX_VAL = 10000;
List<Integer> linkedList = new LinkedList<Integer>();
List<Integer> arrayList = new ArrayList<Integer>();
for(int i = 0; i < MAX_VAL; i++) {
linkedList.add(i);
arrayList.add(i);
}
long time = System.nanoTime();
for(int i = 0; i < MAX_VAL; …Run Code Online (Sandbox Code Playgroud) List li = new LinkedList();
for (int i = 0; i < 100; i++) {
li.add(i);
}
long start1 = System.nanoTime();
li.get(57);
long end1 = System.nanoTime();
long diff1 = end1-start1;
System.out.println("Time taken by LinkedList = "+diff1);
List al = new ArrayList();
for (int i = 0; i < 100; i++) {
al.add(i);
}
Run Code Online (Sandbox Code Playgroud)
我在两个列表上执行的操作,当我打印出所用的时间时,ArrayList总是比LinkedList运行得更快.有人可以解释哪个时间表现更好吗?如果代码中有问题,请告诉我.谢谢!
我正在阅读之间的不同之处ArrayList并LinkedList指出何时使用LinkedList而不是ArrayList?.我开发了一个小的示例applcation来测试一个主要的优点LinkedList但是我获得的结果没有证实,这LinkedList超过ArrayList了操作的性能:
ListIterator.add(E element)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
public static void main(String[] args) {
int number = 100000;
long startTime1 = System.currentTimeMillis();
fillLinkedList(number);
long stopTime1 = System.currentTimeMillis();
long startTime2 = System.currentTimeMillis();
fillArrayList(number);
long stopTime2 = System.currentTimeMillis();
System.out.println(" LinkedList needed: "+ (stopTime1 - startTime1));
System.out.println(" ArrayList needed: "+ (stopTime2 - startTime2));
}
public static void fillLinkedList(int number){
LinkedList<Integer> list = new LinkedList<Integer>();
ListIterator<Integer> it = list.listIterator();
int i = 0;
while(i++<number){
it.add(i);
} …Run Code Online (Sandbox Code Playgroud)