java LinkedList ArrayList 随机访问效率 list.get(int index)
2010-12-02 11:00
459 查看
理论上来说,肯定LinkedList比ArrayList随机访问效率要低,然后LinkedList比ArrayList插入删除元素要快。
突然想起之前写一个日记本程序,是用LinkedList+Map索引,作为数据库。Map记录了LinkedList中每一个日记的index和日期之间的对应关系。从Map中获取到某个日期对应日记的index,然后再去LinkedList,get(index)。
上边一段代码,看出了几样事情:
1.LinkedList的随机访问速度确实差点,大概用了17毫秒。下边会贴出LinkedList随机访问的源代码,也就是这里为什么选择1000000中间数的原因。
2.Java栈区和堆区都是有限的,list那里如果一次添加5000000个item就会内存溢出
(Exception in thread "main" java.lang.OutOfMemoryError: Java heap space)。
但有点奇怪,不是new了在内存堆区吗?内存堆区也会爆~~
下边是LinkedList随机访问的源代码,采取了折半的遍历方式,每个循环里边进行一次int的比较。
换了ArrayList的话,添加5000000个item都不会爆,但再大点,还是会爆~~
随机访问效率确实高很多,只需要16微秒左右,足足快了1千倍,而且跟get的index无关。
突然想起之前写一个日记本程序,是用LinkedList+Map索引,作为数据库。Map记录了LinkedList中每一个日记的index和日期之间的对应关系。从Map中获取到某个日期对应日记的index,然后再去LinkedList,get(index)。
Integer a = 1; LinkedList list = new LinkedList(); for (int i = 0; i < 2000000; i++) { list.add(a); } System.out.println(list.size()); long start = System.nanoTime(); list.get(1000000); long end = System.nanoTime(); System.out.println(end - start);
上边一段代码,看出了几样事情:
1.LinkedList的随机访问速度确实差点,大概用了17毫秒。下边会贴出LinkedList随机访问的源代码,也就是这里为什么选择1000000中间数的原因。
2.Java栈区和堆区都是有限的,list那里如果一次添加5000000个item就会内存溢出
(Exception in thread "main" java.lang.OutOfMemoryError: Java heap space)。
但有点奇怪,不是new了在内存堆区吗?内存堆区也会爆~~
下边是LinkedList随机访问的源代码,采取了折半的遍历方式,每个循环里边进行一次int的比较。
private Entry<E> entry(int index) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException("Index: "+index+ ", Size: "+size); Entry<E> e = header; if (index < (size >> 1)) { for (int i = 0; i <= index; i++) e = e.next; } else { for (int i = size; i > index; i--) e = e.previous; } return e; }
换了ArrayList的话,添加5000000个item都不会爆,但再大点,还是会爆~~
随机访问效率确实高很多,只需要16微秒左右,足足快了1千倍,而且跟get的index无关。
相关文章推荐
- Java中LinkedList的fori和foreach效率比较
- java ArrayList与LinkedList 使用for,forearch,Iterator的遍历效率
- 更改java.util.List中的对象引用String java.util.List.set(int index, String element)
- FAQ(52):java.sql.SQLException: Column Index out of range, 0 > 13. at com.mysql.jdbc.ResultSet.getInt
- int nSelItem = m_wndList.GetSelectedIndex();程序报错的解决
- java Arrarlist中的add(int index,Object ojb)
- Java中list.get(index)报错
- Java数据结构之LinkedList、ArrayList的效率分析
- Java中list.get(index)报错
- HashMap存取效率高原因、ArrayList和LinkedList区别、JAVA实现链表的基本功能
- RandomAccess接口可以判断List对象是否支持快速随机访问(数组的get(i)访问)
- java中List<E>的get(index)用法
- Java中list.get(index)报错
- LinkedList remove(Integer index) remove(E e) remove(int i)
- 关于java列表数据类型(ArrayList, LinkedList)的add与get
- java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
- java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
- Java数据结构之LinkedList、ArrayList的效率分析
- Java 集合(ArrayLsit,LinkedList,Vector,HashMap--HashTable)
- 【幻化万千戏红尘】qianfengDay15-java基础学习:List,ArrayList,LinkedList,comparable,comparator