测试代码如下:
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等这些容器都是可自动扩充的。而对于数组而言才可以认为是罐子,没有自动扩充的功能。问题尽管有些低级,但是也是个人的一个理解过程。
分享到:
相关推荐
可以通过`add`方法添加元素,或者在构造ArrayList时指定初始容量,避免数组为空。 此外,理解ArrayList的动态扩容机制也很重要。当ArrayList容量不足时,它会自动扩容,通常会将当前容量翻倍。这涉及到数组的复制...
### 关于ArrayList与LinkedList的区别 在Java编程语言中,`ArrayList`与`LinkedList`都是`List`接口的具体实现类,用于存储元素集合。虽然它们都实现了同样的接口并且提供了相同的基本功能,但在内部实现机制、性能...
4. **调用ArrayList的add方法**:现在我们有了所有必要的元素,可以调用ArrayList的`add`方法了。 ```c++ env->CallBooleanMethod(listObj, addMethod, intValue); ``` 5. **处理可能出现的异常**:在JNI中,Java...
Collection 接口提供了两个标准的构造函数:无参数的构造函数用于创建一个空的 Collection,有一个 Collection 参数的构造函数用于创建一个新的 Collection,这个新的 Collection 与传入的 Collection 有相同的元素...
- **容量**:ArrayList实例有一个容量,即用于存储列表元素的数组的大小。当添加元素导致容量不足时,ArrayList会自动扩大数组容量。 - **增长策略**:当元素数量达到数组容量极限时,ArrayList会创建一个新的更大...
可以指定初始容量来创建`ArrayList`,这有助于提高性能,尤其是当预先知道集合的大致大小时: ```csharp ArrayList list = new ArrayList(10); // 指定初始容量为10 ``` 也可以通过传递一个现有的`ICollection`...
ArrayList提供了几种构造方法,可以根据需要初始化容量或创建空实例: 1. `ArrayList()`:创建一个空的ArrayList,初始容量为10。 2. `ArrayList(int initialCapacity)`:指定初始容量的ArrayList,避免频繁扩容。 ...
第一个版本是带有一个整型参数的构造器,它允许开发者指定初始容量。如果指定的容量大于0,则会创建一个新的Object数组;如果等于0,则会使用EMPTY_ELEMENTDATA;如果小于0,则会抛出IllegalArgumentException异常。...
关于java的ArrayList的小例子
- **构造器**:ArrayList提供了三个构造器,分别是无参构造器(默认容量16)、接受ICollection参数的构造器(将集合元素复制到ArrayList)以及接受初始容量整数的构造器。 - **IsSynchronized属性和Synchronized...
下面将详细介绍如何使用JavaScript来实现基础的ArrayList功能,并探讨在没有参数重载(overload)的情况下如何处理方法的多样性。 首先,我们需要创建一个ArrayList类,这个类将包含添加、删除、查找、更新和遍历...
2. **指定初始容量**:创建一个空的`ArrayList`,初始容量由参数决定。 3. **基于集合构造**:创建一个包含指定集合中元素的`ArrayList`,元素按原集合的顺序排列。 #### 添加元素 - **`add(E e)`**:向列表尾部...
然后在MainForm的构造函数中,我们创建了一个ArrayList并填充了三个Person对象。接着,我们将ArrayList设置为DataGrid的DataSource,并指定DataGrid的列来显示Person对象的Name和Age属性。 需要注意的是,由于...
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
- **容量管理**: 每个`ArrayList`实例都有一个容量,该容量是用于存储列表中元素的数组大小。当元素被添加到`ArrayList`时,其容量会自动增长,以确保至少能容纳当前列表的大小。 - **非同步**: `ArrayList`是非线程...
- `add()`方法用于向ArrayList添加元素,它通过`ensureCapacityInternal()`确保数组有足够的空间。如果数组已满,`grow()`方法会进行扩容,通常扩容为原来的1.5倍。 - `remove()`方法删除指定位置的元素,需要将...
` 这一步是为了给转换后的DataTable指定一个有意义的名称,通常这个名称与ArrayList中元素类型的名字相同。 2. 获取ArrayList中第一个元素的类型,并通过`GetProperties()`方法获取该类型的属性信息。这些属性将...
创建一个`ArrayList`实例非常简单,只需要调用无参构造函数即可。如示例代码所示: ```vb Dim mycountries As New ArrayList ``` 这段代码创建了一个名为`mycountries`的新`ArrayList`实例。接下来可以使用`Add()`...
如果ArrayList中的元素是自定义类,并且没有实现Comparable接口,或者需要按照非自然顺序进行排序,可以创建一个Comparator实例,并作为`Collections.sort()`方法的参数。例如,假设有一个User类,我们想要根据姓名...