本人java菜鸟,喜欢钻牛角尖,虽然小问题,还是想不通所以不得不问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nightspirit
V2EX    Java

本人java菜鸟,喜欢钻牛角尖,虽然小问题,还是想不通所以不得不问

  •  
  •   nightspirit 2014-01-31 22:59:56 +08:00 5507 次点击
    这是一个创建于 4336 天前的主题,其中的信息可能已经有所发展或是发生改变。
    16 条回复    1970-01-01 08:00:00 +08:00
    Linxing
        1
    Linxing  
       2014-02-01 00:01:29 +08:00   1
    你还真的是爱钻牛角尖啊,我的看法是没必要,以现在计算机的速度,在乎这些吗,如果这样一味追求性能,ruby都没能用了
    SoloCompany
        2
    SoloCompany  
       2014-02-01 00:49:31 +08:00   1
    这好像是一个常识了吧,LinkedList 基本上是毫无用途的,只有在很特殊很特殊的场合,它才会有能派上用场的地方。对于编程人员来说,只要遵守一个很简单的原则就是了,那就是从来不要使用 LinkedList,除非你很清楚你的数据结构需要 LinkedList 特别优化,否则,任何场合都应该使用 ArrayList
    dndx
        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 理论上要快一些,因为是连续存储,省了一次指针引用。但是实际应用中这一点区别实在是没有意义,根据你需要的操作,适合的才是最好的。
    ovear
        4
    ovear  
       2014-02-01 03:48:12 +08:00   1
    @dndx 是的,只要频繁删除LinkedList是绝对快于ArrayList的,而且LinkedList可以支持插入到指定位置。ArrayList是一定会进行重新调整的。估计是LinkedList的时间估计是差在寻到对象的时间。

    简单地说,ArrayList适合增加删除操作少,且经常随机读取的情况。
    ruoyu0088
        5
    ruoyu0088  
       2014-02-01 06:34:27 +08:00   1
    我不懂Java,能不能给一个插入到LinkedList指定位置的例子。这个位置是如何指定的,是一个特殊的位置对象,保存了LinkedList中的某个位置,还是就是一个整数下标?
    如果是整数下标的话,LinkedList遍历到那个下标n处的时候不就已经需要n步操作了吗。
    terry0824
        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维护元素数量。
    SErHo
        7
    SErHo  
       2014-02-01 06:57:06 +08:00 via Android   1
    @ruoyu0088 比如你需要实现一个 LRU,就会用到。
    ruoyu0088
        8
    ruoyu0088  
       2014-02-01 07:24:27 +08:00   1
    @terry0824 如果需要遍历到index处的话,那么插入到指定index的操作就不是O(1)了吧。
    doing
        9
    doing  
       2014-02-01 08:42:15 +08:00   2
    你需要一个工具JD-GUI,看源代码实现,应该比较清楚吧
    dndx
        10
    dndx  
       2014-02-01 09:49:34 +08:00   1
    @doing JDK 本来就是开源的,不需要 JD
    nightspirit
        11
    nightspirit  
    OP
       2014-02-01 10:16:10 +08:00
    感谢大神@dndx 的详细回答,也多谢大家关注我的问题,我才学java不久,看到书上说的和我的实验结果相反,所以我就一定想要追根究底
    doing
        12
    doing  
       2014-02-01 13:52:46 +08:00
    @dndx 随便啊,只是推荐JD-GUI查看更方便而已,个人意见。
    Narcissu5
        13
    Narcissu5  
       2014-02-01 16:04:41 +08:00
    查看下生成的bytecode

    现代JVM都是高度优化的,变量其实很多
    SoloCompany
        14
    SoloCompany  
       2014-02-01 22:13:37 +08:00
    http://www.onjava.com/pub/a/onjava/2001/05/30/optimization.html

    建议楼主看看这个,虽然年代有点老了,但结论对于现代jvm仍然适用
    mx1700
        15
    mx1700  
       2014-02-02 19:38:52 +08:00
    感觉上不管用何种方式遍历元素,ArrayList都应该比LinkedList快啊
    ArrayList的迭代器内部也是通过一个索引下标变量来访问值啊
    ArrayList的下标访问肯定比 LinkedList指针引用快

    迭代器 比 for 慢是因为每次调用hasNext方法的开销吧
    Ricepig
        16
    Ricepig  
       2014-02-03 03:59:21 +08:00
    @dndx 有些情况下(几率还不低)ArrayList会比LinkedList迭代快得多,这是因为有cache,而ArrayList在内存中是连续的,所以。。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5250 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 07:58 PVG 15:58 LAX 23:58 JFK 02:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86