A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 冷叙辰 中级黑马   /  2013-3-12 19:55  /  1782 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1.                 Random r = new Random();
  2.                 List<String> arrayList = new ArrayList<String>();
  3.                 List<String> linkedList = new LinkedList<String>();
  4.                 for (int i = 0; i < 10000; i++) {
  5.                         arrayList.add("string" + i);
  6.                 }
  7.                 for (int i = 0; i < 10000; i++) {
  8.                         linkedList.add("string" + i);
  9.                 }
  10.                 long start = 0;
  11.                 long end = 0;
  12.                 start = System.currentTimeMillis();
  13.                 for (int i = 0; i < 10000; i++) {
  14.                         arrayList.remove(r.nextInt(10000));
  15.                         arrayList.add(r.nextInt(10000), "string" + i);
  16.                 }
  17.                 end = System.currentTimeMillis();
  18.                 System.out.println("arrayList的时间"+(end - start));
  19.                 start = System.currentTimeMillis();
  20.                 for (int i = 0; i < 10000; i++) {
  21.                         linkedList.remove(r.nextInt(10000));
  22.                         linkedList.add(r.nextInt(10000), "string" + i);
  23.                 }
  24.                 end = System.currentTimeMillis();
  25.                 System.out.println("linkedList的时间"+(end - start));
  26.        
复制代码
在链表和数组中的随机位置增删元素,大家都说是链表的速度快,但是我发现实际情况却是数组的耗时比较短啊

这个原因是什么啊?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

3 个回复

倒序浏览
这种说法是在只考虑数据结构的情况下是如此
而你这里使用的是java包装的类  当然 实现不一样 执行性能也就不一样了


这是arraylist的remove
  1.     public E remove(int index) {
  2.         RangeCheck(index);

  3.         modCount++;
  4.         E oldValue = (E) elementData[index];

  5.         int numMoved = size - index - 1;
  6.         if (numMoved > 0)
  7.             System.arraycopy(elementData, index+1, elementData, index,
  8.                              numMoved);
  9.         elementData[--size] = null; // Let gc do its work

  10.         return oldValue;
  11.     }
复制代码
这是linkedlist 的remove
  1.     private E remove(Entry<E> e) {
  2.         if (e == header)
  3.             throw new NoSuchElementException();

  4.         E result = e.element;
  5.         e.previous.next = e.next;
  6.         e.next.previous = e.previous;
  7.         e.next = e.previous = null;
  8.         e.element = null;
  9.         size--;
  10.         modCount++;
  11.         return result;
  12.     }
复制代码
下面这个是用对象模仿的指针  执行效率 肯定要低些

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
对于那些告诉你链表比数组随机访问快的人,下次就别听他们忽悠了。
数组以及和数组类似的ArrayList 在随机访问方面都比链表快,但是这两个数据结构的插入移除操作要比链表慢很多。在应用时,根据要用这些数据实现的功能以及常用的操作来综合考虑 要选择的数据结构。
链表不光有插入移除快的优点,还能轻松的用作栈、队列等,是一个比较灵活的数据结构。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
楼主,请及时结贴。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马