黑马程序员技术交流社区
标题:
关于数组和链表增删元素的问题
[打印本页]
作者:
冷叙辰
时间:
2013-3-12 19:55
标题:
关于数组和链表增删元素的问题
Random r = new Random();
List<String> arrayList = new ArrayList<String>();
List<String> linkedList = new LinkedList<String>();
for (int i = 0; i < 10000; i++) {
arrayList.add("string" + i);
}
for (int i = 0; i < 10000; i++) {
linkedList.add("string" + i);
}
long start = 0;
long end = 0;
start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
arrayList.remove(r.nextInt(10000));
arrayList.add(r.nextInt(10000), "string" + i);
}
end = System.currentTimeMillis();
System.out.println("arrayList的时间"+(end - start));
start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
linkedList.remove(r.nextInt(10000));
linkedList.add(r.nextInt(10000), "string" + i);
}
end = System.currentTimeMillis();
System.out.println("linkedList的时间"+(end - start));
复制代码
在链表和数组中的随机位置增删元素,大家都说是链表的速度快,但是我发现实际情况却是数组的耗时比较短啊
123Z8V[[UOV}F.jpg
(6.88 KB, 下载次数: 26)
下载附件
2013-3-12 19:49 上传
这个原因是什么啊?
作者:
彭颖
时间:
2013-3-12 20:51
这种说法是在只考虑数据结构的情况下是如此
而你这里使用的是java包装的类 当然 实现不一样 执行性能也就不一样了
这是arraylist的remove
public E remove(int index) {
RangeCheck(index);
modCount++;
E oldValue = (E) elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
复制代码
这是linkedlist 的remove
private E remove(Entry<E> e) {
if (e == header)
throw new NoSuchElementException();
E result = e.element;
e.previous.next = e.next;
e.next.previous = e.previous;
e.next = e.previous = null;
e.element = null;
size--;
modCount++;
return result;
}
复制代码
下面这个是用对象模仿的指针 执行效率 肯定要低些
作者:
李辉
时间:
2013-3-13 06:28
对于那些告诉你链表比数组随机访问快的人,下次就别听他们忽悠了。
数组以及和数组类似的ArrayList 在随机访问方面都比链表快,但是这两个数据结构的插入移除操作要比链表慢很多。在应用时,根据要用这些数据实现的功能以及常用的操作来综合考虑 要选择的数据结构。
链表不光有插入移除快的优点,还能轻松的用作栈、队列等,是一个比较灵活的数据结构。
作者:
猫腻
时间:
2013-3-13 09:43
楼主,请及时结贴。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2