List:集合中的元素是有序的,元素可以重复。因为该集合体系有索引。以下为三个常见子类对象:
1,ArrayList:底层的数据结构使用的是数组形式。查询非常快,增删慢。线程同步。它是可变长度数组,就是默认容量是10,要存储的数据量超过10时,就会新创建一个数组,容量延长50%,然后把原数组中的数据copy到新数组中,然后再添加数据到后面,最后把原来的数组删除。
2,LinkedList:底层使用的是链表数据结构。增删很快,查询稍慢。
LinkedList特有方法:
addFirst();
addLast();
getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementsException.
removeFirst();
removeLast();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementsException.
在JDK1.6中出现了替代方法。
offertFirst(); offerLast();
peekFirst(); peekLase();
获取元素,但不删除元素。如果集合中没有元素,则会返回null.
pollFirst(); pollLast();
获取元素,但是元素被删除。如果集合中没有元素,则会返回null.
3,Vector:底层是数组数据结构。线程同步。被ArrayList替代。
可变长度数组,100%延长。
Vector中的枚举是其特有的取出方式。
枚举和迭代器很像,其实枚举和迭代器一样,因为枚举的名称以及方法的名称都过长,所以被迭代器取代了。
List特有的方法:凡是可以操作角标的方法都是该体系特有的方法。
增:add(index,element) ,addAll(index,Collection)
删:remove(index)
改:set(index,element)
查:get(index)(通过size的配合可以遍历集合),subList(from,to),Iterator(),listIterator(),indexOf()等。
不能对同一组元素进行多种同时操作,可能会引发并发情况。不能使用集合和迭代器同时操作一组元素。
在迭代过程中准备添加或者删除元素:listIterator()(继承iterator)。
List集合特有的迭代器ListIterator是Iterator的子接口。在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。
ArrayList al = new ArrayList();
Iterator it = al.iterator();
While(it.hasNext())
{
Object obj = it.next();
If(obj.equals("java02"))
Al.add("java005");//错。通过集合对象的方式操作了集合中的元素,引发并发异常。
Sop(obj);
}(在通过迭代器的方式操作元素时,又通过集合的方式操作元素,产生了并发修改异常)
所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator的方法是有限的,只能对元素进行判断,取出,删除的操作。如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。该接口只能通过List集合的ListIterator方法实现。
ListIteretor li = al.listTterator();
List集合判断元素是否相同,依据的是元素的equals方法,而不是对象的地址值。删除的时候,加入的时候判断重复等。
|
|