论坛首页 Java企业应用论坛

《Thinking in Java》中Arrays.asList的解释错误

浏览 11580 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-01-24  
asList返回的是内部的ArrayList.其和java.util.ArrayList不同。最大的区别就是没有add方法,只能扔exception.
内部ArrayList类,性能并不是最大考虑的,而是在设计的意义上,数组应该是固定大小的。
0 请登录后投票
   发表时间:2011-01-24  
akunamotata 写道
其实觉得可以直接使用java.util.ArrayList,为什么要实现一个静态内部类?也是出于性能的考虑?


保证这个List永远是这个Array的实时数据,并且,这个List永远是只读的
0 请登录后投票
   发表时间:2011-01-24   最后修改:2011-01-24
Java Collection Framework中只保证了基本实现中会实现接口中的所有方法,其他实现类中不必全部实现,如果不实现的话,要抛出异常;

对于List接口基本实现就是util包中的ArrayList和LinkedList了;

Arrays.asList返回一个静态数组的原因,我同意yangyi的,是为了性能;

如果要resize的话,再用util包里的ArrayList来包装下OK了;
0 请登录后投票
   发表时间:2011-01-24  
HelloJimmy 写道
Java Collection Framework中只保证了基本实现中会实现接口中的所有方法,其他实现类中不必全部实现,如果不实现的话,要抛出异常;

对于List接口基本实现就是util包中的ArrayList和LinkedList了;

Arrays.asList返回一个静态数组的原因,我同意yangyi的,是为了性能;

如果要resize的话,再用util包里的ArrayList来包装下OK了;



如果是Fixed size,java.util.ArrayList(注意构造参数)和Arrays.asList的读速度不是一样吗?

那里提高的性能?
0 请登录后投票
   发表时间:2011-01-24  
AllenZhang 写道
asList返回的是内部的ArrayList.其和java.util.ArrayList不同。最大的区别就是没有add方法,只能扔exception.
内部ArrayList类,性能并不是最大考虑的,而是在设计的意义上,数组应该是固定大小的。



我赞同,如果光是读的话,性能是一样的。
0 请登录后投票
   发表时间:2011-01-25  
这点恰好昨天我也看了,我要学习楼主这种精神
0 请登录后投票
   发表时间:2011-01-25  
书中说的没错呀,底层确实是一个数组
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;

ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
    a = array;
}
0 请登录后投票
   发表时间:2011-01-25   最后修改:2011-01-25
skyuck 写道
书中说的没错呀,底层确实是一个数组
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;

ArrayList(E[] array) {
            if (array==null)
                throw new NullPointerException();
    a = array;
}


数组是没错,但是java.util.ArrayList提供了add方法来改变这个数组的大小,你可以看下它的源码。
这个静态内部类不是不可以实现这个add方法,而是在设计的意义上,数组应该是固定大小的。
0 请登录后投票
   发表时间:2011-01-25  
yangyi 写道
没有做Array Copy动作,应该是基于性能的考量

我觉得不是基于性能的考量,留意它的名字,Arrays as List,就是array的本质没有变,只是以List的形式出现,方便使用而已.
0 请登录后投票
   发表时间:2011-01-25  
Turbo 写道
yangyi 写道
没有做Array Copy动作,应该是基于性能的考量

我觉得不是基于性能的考量,留意它的名字,Arrays as List,就是array的本质没有变,只是以List的形式出现,方便使用而已.

同意,觉得这个才是正解。
底层仍然是一个数组,保持数组能拥有的所有操作。
比如修改某一个元素,或者遍历。
但是不能够改变长度。
只是以List形态出现,为了某些仅对List读操作的方法可以顺利的执行。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics