`
weilJava
  • 浏览: 70034 次
  • 性别: Icon_minigender_1
  • 来自: 南京
文章分类
社区版块
存档分类
最新评论

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

阅读更多
测试代码如下:
		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);
		}


会报异常


补:在这个问题上我起初理解的有些偏差,一直认为list是一个像现实的一个容器,不妨假设为一个罐子,当它的模板定下来后,那么它的容量是一定的。其实这种理解是有很大的问题,在java中像list、map等这些容器都是可自动扩充的。而对于数组而言才可以认为是罐子,没有自动扩充的功能。问题尽管有些低级,但是也是个人的一个理解过程。
分享到:
评论

相关推荐

    关于 ArrayList get(0)的异常JDK源码跟进

    可以通过`add`方法添加元素,或者在构造ArrayList时指定初始容量,避免数组为空。 此外,理解ArrayList的动态扩容机制也很重要。当ArrayList容量不足时,它会自动扩容,通常会将当前容量翻倍。这涉及到数组的复制...

    关于arraylist和linkedList的区别

    ### 关于ArrayList与LinkedList的区别 在Java编程语言中,`ArrayList`与`LinkedList`都是`List`接口的具体实现类,用于存储元素集合。虽然它们都实现了同样的接口并且提供了相同的基本功能,但在内部实现机制、性能...

    jni操作arraylist对象

    4. **调用ArrayList的add方法**:现在我们有了所有必要的元素,可以调用ArrayList的`add`方法了。 ```c++ env-&gt;CallBooleanMethod(listObj, addMethod, intValue); ``` 5. **处理可能出现的异常**:在JNI中,Java...

    ArrayList LinkedList Vector区别

    Collection 接口提供了两个标准的构造函数:无参数的构造函数用于创建一个空的 Collection,有一个 Collection 参数的构造函数用于创建一个新的 Collection,这个新的 Collection 与传入的 Collection 有相同的元素...

    ArrayList的实现原理

    - **容量**:ArrayList实例有一个容量,即用于存储列表元素的数组的大小。当添加元素导致容量不足时,ArrayList会自动扩大数组容量。 - **增长策略**:当元素数量达到数组容量极限时,ArrayList会创建一个新的更大...

    arraylist用法

    可以指定初始容量来创建`ArrayList`,这有助于提高性能,尤其是当预先知道集合的大致大小时: ```csharp ArrayList list = new ArrayList(10); // 指定初始容量为10 ``` 也可以通过传递一个现有的`ICollection`...

    ArrayList类操作程序实例

    ArrayList提供了几种构造方法,可以根据需要初始化容量或创建空实例: 1. `ArrayList()`:创建一个空的ArrayList,初始容量为10。 2. `ArrayList(int initialCapacity)`:指定初始容量的ArrayList,避免频繁扩容。 ...

    ArrayList源码分析(含jdk1.8).pdf

    第一个版本是带有一个整型参数的构造器,它允许开发者指定初始容量。如果指定的容量大于0,则会创建一个新的Object数组;如果等于0,则会使用EMPTY_ELEMENTDATA;如果小于0,则会抛出IllegalArgumentException异常。...

    关于java的ArrayList的小例子

    关于java的ArrayList的小例子

    ArrayList深度剖析与简单实用

    - **构造器**:ArrayList提供了三个构造器,分别是无参构造器(默认容量16)、接受ICollection参数的构造器(将集合元素复制到ArrayList)以及接受初始容量整数的构造器。 - **IsSynchronized属性和Synchronized...

    JavaScript 实现基础 ArrayList 功能

    下面将详细介绍如何使用JavaScript来实现基础的ArrayList功能,并探讨在没有参数重载(overload)的情况下如何处理方法的多样性。 首先,我们需要创建一个ArrayList类,这个类将包含添加、删除、查找、更新和遍历...

    arrayList原理说明

    2. **指定初始容量**:创建一个空的`ArrayList`,初始容量由参数决定。 3. **基于集合构造**:创建一个包含指定集合中元素的`ArrayList`,元素按原集合的顺序排列。 #### 添加元素 - **`add(E e)`**:向列表尾部...

    使用对象ArrayList填充DataGrid,C#源代码ArrayList MyList = new ArrayList();

    然后在MainForm的构造函数中,我们创建了一个ArrayList并填充了三个Person对象。接着,我们将ArrayList设置为DataGrid的DataSource,并指定DataGrid的列来显示Person对象的Name和Age属性。 需要注意的是,由于...

    JNI与C++数据类型传递示例(包括ArrayList对象、ArrayList嵌套返回)

    一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList&lt;ArrayList&lt;String&gt;&gt;等。

    ArrayList源码Jdk1.8

    - **容量管理**: 每个`ArrayList`实例都有一个容量,该容量是用于存储列表中元素的数组大小。当元素被添加到`ArrayList`时,其容量会自动增长,以确保至少能容纳当前列表的大小。 - **非同步**: `ArrayList`是非线程...

    ArrayList源码分析

    - `add()`方法用于向ArrayList添加元素,它通过`ensureCapacityInternal()`确保数组有足够的空间。如果数组已满,`grow()`方法会进行扩容,通常扩容为原来的1.5倍。 - `remove()`方法删除指定位置的元素,需要将...

    ArrayList转化为DataTable

    ` 这一步是为了给转换后的DataTable指定一个有意义的名称,通常这个名称与ArrayList中元素类型的名字相同。 2. 获取ArrayList中第一个元素的类型,并通过`GetProperties()`方法获取该类型的属性信息。这些属性将...

    ASP .NET - ArrayList对象

    创建一个`ArrayList`实例非常简单,只需要调用无参构造函数即可。如示例代码所示: ```vb Dim mycountries As New ArrayList ``` 这段代码创建了一个名为`mycountries`的新`ArrayList`实例。接下来可以使用`Add()`...

    arrayList排序

    如果ArrayList中的元素是自定义类,并且没有实现Comparable接口,或者需要按照非自然顺序进行排序,可以创建一个Comparator实例,并作为`Collections.sort()`方法的参数。例如,假设有一个User类,我们想要根据姓名...

Global site tag (gtag.js) - Google Analytics