ArrayList和Vector实现类

时间:2021-01-18 04:17:21
ArrayList和Vector类都是基于数组实现的List类,所以ArrayList和Vector类封装了一个动态的、允许再分配的Object[]数组。ArrayList或Vector对象使用initialCapacity参数来设置该数组的长度,当向ArrayList或Vector中添加元素超出了该数组元素的长度时,它们的initialCapacity会自动增加。
对于通常的编程场景,程序员无须关心ArrayList或Vector的initialCapaccity。但如果向ArrayList或Vector集合添加大量元素时,可以使用ensureCapacity(int minCapacity)方法一次性地增加initialCapacity。这可以减少重分配的次数。从而提高性能。
如果开始就知道ArrayList或Vector集合需要保存多少个元素,则可以在创建它们时就指定initialCapacity大小。如果创建空的initialCapacity集合时 不指定initialCapacity参数,则Object[]数组的长度默认为10。
除此之外,ArrayList和Vector还提供了如下两个方法来重新分配Object[]数组。
--void ensureCapacity(int minCapacity):将ArrayList或Vector几个的Object[]数组长度增加大于或等于minCapacity值。
--void trimToSize():调整ArrayList或Vector集合的Object[]数组长度为当前元素的个数。调用该方法可减少ArrayList或Vector集合对象占用的存储空间。
ArrayList和Vector在用法上几乎完全相同,但由于Vector是一个古老的集合,那时候Java还没有提供系统的几个框架,所以Vector里提供了一些方法名很长的方法,例如addElement(Object obj),实际上这个方法与add(Object obj)没有任何区别。从JDK1.2以后,Java提供了系统的集合框架,就将Vector改为实现List接口,作为List的实现之一,从而导致Vector里有一些功能重复的方法。
Vector的系列方法中方法名更短的方法属于后来新增的方法,方法名更长的方法则是Vector原有的方法。Java改写了Vector原有的方法,将其方法名缩短是为了简化编程。而ArrayList开始就作为List的主要实现类,因此没有那些方法名很长的方法,实际上,Vector具有很多缺点,通常尽量少用Vector实现类。
除此之外,ArrayList和Vector的显著区别是:ArrayList是线程不安全的,当多个线程访问同一个ArrayList集合时,如果有超过一个线程修改了ArrayList集合,则程序必须手动保证该集合的同步性:但Vector集合则是线程安全的,无须程序保证该集合的同步性,因为Verctor是线程安全的,所以Vector的性能比ArrayList的性能要低。实际上,即使需要保证List集合线程安全,也同样不推荐使用Vector是实现类。后面会介绍一个Collections工具类,它可以将一个ArrayList变成线程安全的。
Vector还提供了一个Stack子类,它用于模拟"栈"这种数据结构,”栈“通常是指”后进先出“的容器。最后push进栈的元素,将最先被”pop“出栈。与Java中的其他集合一样,进栈出栈的都是Objcet,因此从栈中取出元素后必须进行类型转换,除非你只是使用Object具有的操作。所以Stack类里提供了如下几个方法。
--Object peek():返回”栈“的第一个元素,但并不将该元素”pop“出栈。
--Object pop():返回”栈“的第一个元素,并将该元素”pop“出栈。
void push(Object item):将一个元素”push“出栈,最后一个进"栈"的元素总是位于栈顶。
需要指出的是,由于Stack继承了Vector,因此它也是一个非常古老的Java集合类,它同样是线程安全的、性能较差的,因此应该尽量少用Stack类。