黑马程序员_泛型数组列表

-------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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值