java arraylist问题

.ArrayList的问题。


有关ArrayList无非就是一下一些基本认知:非线程安全,初始容量为10,按照1.5倍扩容,底层采用数组elementData实现,对于随机访问get和set效率比较高,对于add和remove效率比LinkedList要低。当要扩容时采用System.arrayCopy()这个native方法实现。

但是ArrayList有两个点需要注意的。

第一个是 ArrayList 有个 trimToSize() 方法用来缩小 elementData 数组的大小,这样可以节约内存。考虑这样一种情形,当某个应用需要,一个 ArrayList 扩容到比如 size=10000,之后经过一系列 remove 操作 size=15,在后面的很长一段时间内这个 ArrayList 的 size 一直保持在 < 100 以内,那么就造成了很大的空间浪费,这时候建议显式调用一下 trimToSize() 这个方法,以优化一下内存空间。或者在一个 ArrayList 中的容量已经固定,但是由于之前每次扩容都扩充 50%,所以有一定的空间浪费,可以调用 trimToSize() 消除这些空间上的浪费。

第二个是ArrayList中有个不合理之处,就是ArrayList是implements RandomAccess这个接口的。关于RandomAccess接口JDK中有明确定义:实现了RandomAccess接口的集合框架,采用迭代器遍历比较慢,不推荐。 原文是这么说的:

It is recognized that the distinction between random and sequential access is often fuzzy. For example, some List implementations provide asymptotically linear access times if they get huge, but constant access times in practice. Such a List implementation should generally implement this interface. As a rule of thumb, a List implementation should implement this interface if, for typical instances of the class, this loop:

for (int i=0, n=list.size(); i < n; i++)

        list.get(i);

runs faster than this loop:

    for (Iterator i=list.iterator(); i.hasNext(); )

        i.next();

但是ArrayList的toString()方法是继承了AbstractCollection的,这个方法用的是迭代器的遍历方式。详细可以参《RandomAccess?!》。

而且如果采用Java中的foreach语法糖进行遍历ArrayList的话,Javac在解语法糖时是解释成迭代器的遍历方式而没有解释成普通for()循环list.get(i)的方式,详细可以参考《Java语法糖之foreach》。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • .ArrayList的问题。 有关ArrayList无非就是一下一些基本认知:非线程安全,初始容量为10,按照1....
    当幸福来敲门我阅读 1,517评论 0 0
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 5,427评论 0 3
  • 随着互联网在日常生活中的普及和发展,人们的生活方式和支付方式已发生巨大改变,网购作为一种新兴的购物方式正在崛起,然...
    盆攀攀阅读 1,639评论 0 0
  • 今天是周六,儿子不上学,吃过早饭小家伙就拿出作业开始写了。由于天比较热,外边没有玩的小朋友,所以儿子今天完全...
    邓启旭邓君浩妈妈阅读 1,184评论 0 1
  • 挑战自己的学习力 学习母婴关系,积木疗愈,游戏力 结果和证书不重要,重要的是内化到自己的行为上
    诗琪很勇敢阅读 1,400评论 0 0

友情链接更多精彩内容