在操作集合时,常常使用数组和动态的ArrayList(数组列表,因为ArrayList的底层实现是通过数组来实现的)类,但是,数组和数组列表在操作的时候有一个重大缺陷,如:在数组中删除一个元素时,当元素被删除后将导致该元素后面的元素都要想数组的前端移动;在数组中插入一个元素时,将导致该元素相邻的元素都要向后移动,所以这一系列的操作将会大大的消耗系统的性能。
数组在连续的存储位置上存放的是对象的引用,而链表则将对象存放在一个独立的节点中。每个节点又存放着集合序列中的下一节点。由于链表的实现都是双向的,所以在存储下一节点的同时,还存储着指向上一个节点的引用。在添加元素时,常常调用LinkedList.add()方法,但该方法总是将元素插入到集合的末尾,假如要将元素添加到链表指定的位置,那LinkedList.add()方法就无能为力了,此时就需要借助ListIterator接口中的方法了。
ListIterator:列表迭代器,用于反向遍历链表,该接口提供了如下方法:
1、 add(E e): 将指定的元素插入到集合中,该方法无返回值,它在操作时总会改变链表结构。该元素直接插入到 next 返回的下一个元素的前面(如果有),或者 previous返回的下一个元素之后(如果有);如果列表没有元素,那么新元素就成为列表中的唯一元素。新元素被插入到隐式光标前:不影响对 next 的后续调用,并且对 previous 的后续调用会返回此新元素
2、 previous():返回列表中的前一个元素。
3、hasPrevious():如果以逆向遍历列表,列表迭代器有多个元素,则返回true。
4、 nextIndex():返回对 next 的后续调用所返回元素的索引。
5、 previousIndex():返回对 previous 的后续调用所返回元素的索引。(如果列表迭代器在列表的开始,则返回 -1)。
6、set(E e):用指定元素替换 next 或 previous 返回的最后一个元素。只有在最后一次调用 next 或 previous 后既没有调用 ListIterator.remove 也没有调用 ListIterator.add 时才可以进行该调用。
以下是一个简单的实例方法:
/**
* 初始化集合元素的方法
* @param linkedList
*/
public void initLinkedList(LinkedList<String> linkedList){
linkedList.add("C");
linkedList.add("B");
linkedList.add("X");
}
/**
* 使用正向迭代出集合中的元素
* @param listIterator 链表迭代器
*/
public void iteratornext(ListIterator<String> listIterator){
while(listIterator.hasNext()){
System.out.print(listIterator.next().toString()+" ");
}
System.out.println();
}
/**
* 使用反向迭代出集合中的元素
* @param listIterator 链表迭代器
*/
public void iteratorPrevious(ListIterator<String> listIterator){
//使用链表迭代器的方法反向迭代出集合中的元素 此时元素的顺序为:A X B C
while(listIterator.hasPrevious()){
System.out.print(listIterator.previous()+" ");
}
System.out.println();
}
/**
* 使用链表迭代器向指定的元素位置添加新的元素
* @param listIterator 链表迭代器
* @param item 指定的元素
* @param newItem 需要添加的新元素
* @return
*/
public void addItem(ListIterator<String> listIterator,String item,String newItem){
while(listIterator.hasNext()){
String str = listIterator.next();
if(str.equals(item)){
listIterator.add(newItem);
}
}
}
/**
* 使用链表迭代器将指定的元素替换成信息元素
* @param listIterator 链表迭代器
* @param item 要替换的元素
* @param newItem 替换后的新元素
* @return
*/
public void updateItem(ListIterator<String> listIterator,String item,String newItem){
while(listIterator.hasNext()){
String str = listIterator.next();
if(str.equals(item)){
listIterator.set(newItem);
}
}
}
public static void main(String[] args) {
ListIteratorDemo demo = new ListIteratorDemo();
//声明一个链表对象
LinkedList<String> linkedList = new LinkedList<String>();
demo.initLinkedList(linkedList);
//strList.listIterator()调用该方法返回一个链表迭代器对象
ListIterator<String> listIterator = linkedList.listIterator();
//正向迭代出集合中的元素对象
demo.iteratornext(listIterator);
//使用迭代器的Add()方法想集合中添加元素,添加元素的位置为集合的末尾
listIterator.add("A");
//反向迭代出集合中的元素
demo.iteratorPrevious(listIterator);
//在集合的B元素后添加H元素
demo.addItem(listIterator, "B", "H");
for(int i=0;i<linkedList.size();i++){
System.out.print(linkedList.get(i)+" ");
}
listIterator = linkedList.listIterator();
demo.updateItem(listIterator, "C", "G");
for(int i=0;i<linkedList.size();i++){
System.out.print(linkedList.get(i)+" ");
}
}