1
Linxing 2014-02-01 00:01:29 +08:00 1
你还真的是爱钻牛角尖啊,我的看法是没必要,以现在计算机的速度,在乎这些吗,如果这样一味追求性能,ruby都没能用了
|
2
SoloCompany 2014-02-01 00:49:31 +08:00 1
这好像是一个常识了吧,LinkedList 基本上是毫无用途的,只有在很特殊很特殊的场合,它才会有能派上用场的地方。对于编程人员来说,只要遵守一个很简单的原则就是了,那就是从来不要使用 LinkedList,除非你很清楚你的数据结构需要 LinkedList 特别优化,否则,任何场合都应该使用 ArrayList
|
3
dndx 2014-02-01 03:23:14 +08:00 2
LZ 你需要的是一些基本的数据结构知识,至于 @SoloCompany “LinkedList 基本上毫无用途” 的说法,实在过于可笑,不予反驳。
LinkedList 是一个双向链表,优势在于在链表的任何地方做删减操作时间复杂度为 O(1),比如你要是需要做一个队列,那么 LinkedList 的这点优势就可以用上。 ArrayList 是一个自动增长的 array ,优势在由于数据在内存上连续存储,随机存取速度为 O(1),但是在数组中插入和删除数据可能会触发 shift/resize ,所以最坏情况下时间复杂度会达到 O(n)。如果读比删减频繁,那么 ArrayList 会有明显的优势。 至于哪个迭代更快,他们两个迭代的时间复杂度都是 O(1),如果硬是要分出个胜负,ArrayList 理论上要快一些,因为是连续存储,省了一次指针引用。但是实际应用中这一点区别实在是没有意义,根据你需要的操作,适合的才是最好的。 |
4
ovear 2014-02-01 03:48:12 +08:00 1
@dndx 是的,只要频繁删除LinkedList是绝对快于ArrayList的,而且LinkedList可以支持插入到指定位置。ArrayList是一定会进行重新调整的。估计是LinkedList的时间估计是差在寻到对象的时间。
简单地说,ArrayList适合增加删除操作少,且经常随机读取的情况。 |
5
ruoyu0088 2014-02-01 06:34:27 +08:00 1
我不懂Java,能不能给一个插入到LinkedList指定位置的例子。这个位置是如何指定的,是一个特殊的位置对象,保存了LinkedList中的某个位置,还是就是一个整数下标?
如果是整数下标的话,LinkedList遍历到那个下标n处的时候不就已经需要n步操作了吗。 |
6
terry0824 2014-02-01 06:49:51 +08:00 1
@ruoyu0088 LinkedList与index相关的操作是用指针(不确定这个说法是否准确,就是Node的reference)从head或tail(哪头近从哪头走)遍历到所要找的index处然后进行操作,所以最坏情况就是在最中间,n/2步操作。
http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html LinkedList有一个size()方法可以返回表长度,应该就是有一个field维护元素数量。 |
9
doing 2014-02-01 08:42:15 +08:00 2
你需要一个工具JD-GUI,看源代码实现,应该比较清楚吧
|
11
nightspirit OP 感谢大神@dndx 的详细回答,也多谢大家关注我的问题,我才学java不久,看到书上说的和我的实验结果相反,所以我就一定想要追根究底
|
13
Narcissu5 2014-02-01 16:04:41 +08:00
查看下生成的bytecode
现代JVM都是高度优化的,变量其实很多 |
14
SoloCompany 2014-02-01 22:13:37 +08:00
|
15
mx1700 2014-02-02 19:38:52 +08:00
感觉上不管用何种方式遍历元素,ArrayList都应该比LinkedList快啊
ArrayList的迭代器内部也是通过一个索引下标变量来访问值啊 ArrayList的下标访问肯定比 LinkedList指针引用快 迭代器 比 for 慢是因为每次调用hasNext方法的开销吧 |