前面讲到数组时提到数组的一个重要的特性那就是数组一旦建立其大小将固定不变,显然这在很多场合下无法满足我们实际的需要,为了解决这个问题,Java提供了一些集合类来使用。这里主要讲一下ArrayList和LInkedList。 ArrayLIst和LInkedList都属于集合类,他们都继承自LIst。两者在使用上区别不是很大,但在效率方面存在一些差距,需要根据具体情况来选择使用。下面看看它们的一些使用情况。
- ArrayList内部是以数组的方式实现,你也可以将它看做是一个可动态扩展的数组。所以它的执行效率跟数组很相似——随机访问效率高,但添加和删除的效率很低,因为需要移动数据。而 LInkedList内部是以链表的方式实现,所以它在随机访问时效率较低,需要从头开始找,但是它的添加和删除操作方便。
- 这两个类都及继承自LIst,所以它们都允许存在相同的元素,包括null。
- 两者都实现了动态添加、移除、设置、查询等方法。所不同的是LinkedList因为是基于链表的实现,所有还有获得及移除头尾的方法,另外它还实现了peek,push,poll,pop等方法,可以用来实现栈以及队列等。
- 在数组里面,我们见识了for循环的遍历操作。那么在这里也是可以使用的,不过数组是通过length属性获得长度,而这里两种数据结构则是通过size()方法获取长度,另外获得元素值也跟数组有些差别,是通过get(index)的方法来实现。当然LinkedList还有getFirst,getLast的方法。
- 除了上面提到的for循环遍历之外,List类还实现了迭代的方式。通过iterator()方法获得迭代因子,通过hasNext(), next()方法实现迭代。
- 还有一点需要注意,ArrayList是以数组的方式实现,我们知道数组在定义时先是给出了空间大小,ArrayList做为动态数组,其实也是有大小的,只不过这个大小可以在使用时根据情况来增大。但是并不是每次使用ArrayList时都是刚好是所需要的大小,比如定义了一个ArrayLIst的引用,系统会默认给其分配一个大小为N的容量,而不论我们是否需要向其添加N个元素,而如果添加的元素为N+1时,系统会对ArrayList进行一次扩容,一般是增加原来的50%及N/2。这里可以看到如果使用的不好ArrayList将会特别的耗空间。
- 最后一点,这两个数据结构使用时都是非同步的,关于这个问题后面再去讨论。
下面贴一小段代码来体会这两种数据结构的使用。至于两者效率及空间方面的差异,这里无法体现。
ArrayList<String> ary;
ary = new ArrayList<String>();
ary.add("A");
ary.add("B");
ary.add("C");
ary.add(2, "D");
ary.remove(0);
// for(int i = 0; i < ary.size(); i++){
// System.out.println(ary.get(i));
// }
Iterator<String> it = ary.iterator();
while(it.hasNext()){
System.out.print(it.next() + " ");
}
System.out.println();
System.out.println("*************************************");
LinkedList<String> ary2;
ary2 = new LinkedList<String>();
ary2.add("z");
ary2.add("x");
ary2.set(0, "ok");
ary2.set(1, "Ng");
ary2.add(2, "w");
Iterator<String> it1 = ary2.iterator();
while(it1.hasNext()){
System.out.print(it1.next() + " ");
}