java集合之列表迭代器ListIterator

         在操作集合时,常常使用数组和动态的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)+" ");
		}  
	}



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值