-------android培训、java培训、期待与您交流! ----------
在Java中,允许在运行时确定数组的大小。
在Java中,解决这个问题最简单的方法是使用一个被称为ArrayList的类。它使用起来有点像数组,但在添加或删除元素时,具有自动调节数组容量的功能,而不需要为此编写任何代码。
在Java SE 5.0中,ArrayList是一种采用类型参数(type parameter)的泛型类(generic class)。为了指定数组列表保存的元素对象类型,需要用一对尖括号将类名括起来加在后面,例如:ArrayList<Employee>。
下面声明和构造一个保存Employee对象的数组列表:
ArrayList<Employee> staff = newArrayList<Employee>();
使用add方法可以将元素添加到数组列表中:
staff.add(new Employee(“Harry Hacker”,…));
数组列表(ArrayList)管理着对象引用的一个内部数组。最终,数组的全部空间有可能被用尽。如果调用add且内部数组已经满了,数组列表就将自动地创建一个更大的数组,并将所有的对象从较小的数组中拷贝到较大的数组中。
如果已经清楚或估计出数组可能存储的元素数量,就可以在填充数组之前调用ensureCapacity方法:
staff.ensureCapacity(100);
这个方法调用将分配一个包含100个对象的内部数组,然后调用100次add,而不用重新分配空间。
另外,还可把初始容量传递给ArrayList构造器:
ArrayList<Employee> staff = newArrayList<Employee>(100);
数组列表的容量与数组大小的区别:
new ArrayList<Employee>(100); //capacity is 100
new Employee[100];
如果为数组分配100个元素的存储地址,数组就有100个空位置可以使用,而容量为100个元素的数组列表只是拥有保存100个元素的潜力(实际上,重新分配空间的话,将会超过100),但是在最初,甚至完成初始化构造之后,数组列表根本就不含有任何元素。
size方法将返回数组列表中包含的实际元素数目:
staff.size();
将返回staff数组列表的当前元素数量,它等价于数组a的a.length。
一旦能够确认数组列表的大小不再发生变化,就可以调用trimToSize方法,这个方法将存储区域的大小调整为当前元素所需要的存储空间数目。垃圾回收器将回收多余的存储空间。
一旦整理了数组列表的大小,添加新元素就需要花时间再次移动存储块,所以应该确认不会再添加任何元素时,再trimToSize。
访问数组列表的元素:
使用get和set方法实现访问或改变数组元素的操作。
例如,设置第i个元素,可以使用:
staff.set(i,harry);
它等价于数组a的元素赋值:
a[i] = harry;
PS:只有小于或等于数组列表的大小时,才能够调用list.set(i,x)。例如:下面的这段代码是错误的:
ArrayList<Employee> list = newArrayList<Employee>(100); //capacity100, size 0
list.set(0,x);
使用add方法为数组添加新元素,而不要使用set方法。它只能替换数组中已经存在的元素内容。
使用下列格式获得数组列表的元素:
Employee e = staff.get(i);
下面这个技巧可以一举两得,既可以灵活的扩展数组,又可以方便的访问数组元素。首先,创建一个数组,并添加所有的元素:
ArrayList<X> list = newArrayList<X>();
while(…)
{
x=…;
list.add(x);
}
执行完上述操作后,使用toArray方法将数组元素拷贝到一个数组中:
X[] a = new X[list.size()];
list.toArray(a);
除了在数组列表的尾部追加元素之外,还可以在数组列表的中间插入元素。使用带索引参数的add方法:
int n = staff.size() / 2;
staff.add(n,e);
为了插入一个新元素,位于n之后的所有元素都要向后移动一个位置。如果插入新元素之后,数组列表的大小超过了容量,数组列表就会重新分配存储空间。
同样的,可以从数组中删除一个元素:
Employee e = staff.remove(n);
位于这个位置之后的所有元素向前移动一个位置,并且数组的大小减1.
对数组实施插入和删除元素的操作其效率比较低。对于小型数组来说,这一点不必担心,但如果数组存储的元素比较多,又经常需要在中间位置插入,删除元素,就应该考虑使用链表了。
在Java SE 5.0中,可以使用“for each”循环对数组列表遍历。
for(Employee e : staff)
do somethingwith e