论坛首页 Java企业应用论坛

关于ArrayList的有参数构造的疑问

浏览 6598 次
该帖已经被评为隐藏帖
作者 正文
   发表时间:2011-11-14  
测试代码如下:
		List<String> l = new ArrayList<String>(2);
		l.add("444");
		l.add("aaa");
		l.add("xxxx");
		for (String s : l) {
			System.out.println(s);
		}

输出结果:
444
aaa
xxxx


疑问:为什么会打出"xxxx"呢?来看下源码
    /**
     * Constructs an empty list with the specified initial capacity.
     *
     * @param   initialCapacity   the initial capacity of the list.
     * @exception IllegalArgumentException if the specified initial capacity
     *            is negative
     */
    public ArrayList(int initialCapacity) {
	super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
         //这里已经初始化了容器量
	this.elementData = (E[])new Object[initialCapacity];
    }


再看add方法:
    /**
     * Appends the specified element to the end of this list.
     *
     * @param o element to be appended to this list.
     * @return <tt>true</tt> (as per the general contract of Collection.add).
     */
    public boolean add(E o) {
	ensureCapacity(size + 1);  // Increments modCount!!
         //上面测试时参数设为2,这里如果再加应该会越界啊,但是最后缺还add进去了,疑问!!!
	elementData[size++] = o;
	return true;
    }



下面是测试数组的:
		String[] strArr = new String[2];
		strArr[0] = "11";
		strArr[1] = "22";
		strArr[2] = "33";
		for (String ss : strArr) {
			System.out.println(ss);
		}


会报异常
   发表时间:2011-11-14  
悲剧,这个玩意它自增,ensureCapacity 这个方法把数组长度增加了

但是为什么我限制了容量,他还自增啊,那限制容量还起什么作用?
0 请登录后投票
   发表时间:2011-11-14  
ensureCapacity(size + 1);  // Increments modCount!! 

去这个方法里面看看!
0 请登录后投票
   发表时间:2011-11-14  
这个构造方法不是给你限制容量用的,而是给那些知道这个容量的人用的.毕竟自动扩容会造成空间浪费.如果调用方已经知道这个List有多少数据,那么就直接告诉它数组的大小.这样也省了扩容的时候ArrayCopy
0 请登录后投票
   发表时间:2011-11-14  
我已经看过这个方法了,只是我感觉奇怪的地方是为什么我明明规定了容器大小,为什么你还要往里塞呢?如果你能往里塞,那你还弄个初始化容器的值干神马用呢?如果说效率我懂,但是为什么可以超过容器大小呢

就算你造个瓶子说规格是1L了最后却装了1L多,你不认为这个瓶子很不合格吗?

liuwenbo200285 写道
ensureCapacity(size + 1);  // Increments modCount!! 

去这个方法里面看看!

0 请登录后投票
   发表时间:2011-11-14  
chenjingbo 写道
这个构造方法不是给你限制容量用的,而是给那些知道这个容量的人用的.毕竟自动扩容会造成空间浪费.如果调用方已经知道这个List有多少数据,那么就直接告诉它数组的大小.这样也省了扩容的时候ArrayCopy

有道理,可能是我理解思路有点偏离,总感觉这么设计不太合理
0 请登录后投票
   发表时间:2011-11-14  
那不是限制容量,那叫initialCapacity 初始容量。它实际是数组,但有扩容功能,所以让你迷惑了。
0 请登录后投票
   发表时间:2011-11-14  
ArrayList 初始化参数是给你定义一开始容器的大小,免得频繁扩大.因为ArrayList的扩容是复制的,新建另外一个数组把旧的一个个复制过来,所以如果到后期,元素又比较多的时候,扩容的消耗是异常大!
0 请登录后投票
   发表时间:2011-11-14  
这个是初始化值,因为设置过小,频繁的扩容是很消耗性能的
0 请登录后投票
   发表时间:2011-11-14  
这么常识的东西还能上首页。晕
0 请登录后投票
论坛首页 Java企业应用版

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