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》。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • .ArrayList的问题。 有关ArrayList无非就是一下一些基本认知:非线程安全,初始容量为10,按照1....
    当幸福来敲门我阅读 196评论 0 0
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,518评论 0 3
  • 【天下無雙】 -信任就好似一张纸,皱了,就算把它摊开,也不会变回原样。-今天有人来得及找他们的天下无双,但是也...
    赵小怡Mango阅读 249评论 0 0
  • 本周看的书 足球比赛是最好的导师 中国哲学史,仅仅翻了十页 看过的电影 没有 懊悔的事 打卡两次晚了 思考 别把自...
    萱萱墨墨的爸爸阅读 179评论 0 0
  • “嘭”厨房传来一声巨响 我坐在客厅,看着某综艺节目哈哈大笑中 姑父的声音突然提高吼了起来,“我不这样我怎么打开?这...
    我是牛阳阳阅读 262评论 2 5