ArrayList类
在JDK5.0以中,ArrayList是一个采用类型参数的泛型类。JDK5.0以前,java没有泛型类,只有一个ArrayList类,其中保存的类型是Object类型的元素,它是“自适应大小”的集合。java老版本中程序员用Vector类实现动态数组,不过ArrayList更加有效。
数组列表管理着对象引用的一个内部数组。
数组的全部容量有可能被用尽。如果调用add且内部数组已经满了,数组列表就将自动地创建一个更大的数组,并将所有对象从较小的数组中拷贝到较大的数组中。
创建ArrayList
new ArrayList();//默认构造方法,初始容量为10.
new ArrayList();//设置默认容量为4的数组列表
填充容量的方式
1.如果已经清楚或能估计出数组可能存储的元素数量,就可以在填充数组之前调用ensureCapacity方法:
staff.ensureCapacity(100);这个方法调用将分配一个包含100个对象的内部数组。然后调用100次add,而不用重新分配空间。
2.递增分配。容量变化的规则是:((旧容量*3)/2)+1。
数组列表的容量和数组大小的区别
new ArrayList<Employee>(100);//capacity is 100
new Employee[100];//size is 100
容量为100的数组列表只是表示有保存100个元素的能力(实际上,重新分配空间的话,会超过100),但在最初,完成初始化构造后,数组列表里不含有任何元素。
数组分配了100个元素的存储空间,就有100个空位置可以使用了。
一旦能够确认数组列表的大小不再发生变化,就可以调用trimToSize方法。该方法将存储区域的大小调整为当前元素数量所需要的存储空间数目,垃圾回收器将回收多余的存储空间。一旦调整了,添加新元素就需要花时间再次移动存储块,所以应该在确认不会添加任何元素时再调用trimToSize()方法。
动态数组不同实现的比较
ArrayList------不同步(即线程不安全),内部使用数组实现,不同步则效率高。单一线程使用比较好。多线程都是读操作也可以。
Vector-----老类。Java1.0版本就存在了,线程安全,效率低!基本与ArrayList相同,内部也是用数组实现、java1.2版本时升级了集合类(加入了大量的新类),这时Vector也加入到了这个大家庭中,Vector实现了List接口。List接口中的方法名称比较短, 而Vector在List不存在时已经有了自己的一些方法,而这些方法名比较长,所有Vector中有很多功能相同的方法。
LinkedList-------内部使用双向链表实现,它是java集合类中最乱的一个类。
链表和数组:
数组中的元素和地址都是相邻的,所以数组的索引速度最快。ArrayList添加(插入)和移除一个元素的速度就不行了。
链表中元素不是相邻的。每个元素都知道自己下一个元素的位置。最后一个元素指向的位置为null.索引元素效率不行,但插入和移除元素效率很快。