Vector与迭代器模式

本文深入解析Vector的Iterator和ListIterator模式,包括它们的使用、方法及实现。详细介绍了fail-fast机制和与Enumeration的区别。
摘要由CSDN通过智能技术生成

本文主要讲解迭代器模式Vector源码中的使用。参考的JDK版本为1.8。

迭代器模式(Iterator Pattern):提供一种方法来访问聚合对象中的各个元素,而不用暴露这个对象的内部表示。在Java中,Vector的迭代器有两种:Iterator和ListIterator。值得一提的是,elements()方法也能实现类似迭代器的效果。为什么已经有了迭代器,还特意在Vector中新增了elements()呢?在文章最后会作出解释。

Iterator

迭代器是一个用来遍历并选择序列中的对象。Java的Iterator的只能单向移动。

例子

在写如何实现之前,先看一个使用迭代器Iterator的小例子:

import java.util.Iterator;
import java.util.List;
import java.util.Vector;

public class ItrOfVectorTest {
   

	    @org.junit.Test
	    public void test() {
   
	        List list = new Vector<>();
	        list.add("1");
	        list.add("2");
	        list.add("3");
	        list.add("4");
	        Iterator iterator = list.iterator();
	        while (iterator.hasNext()) {
   
	            String str = (String) iterator.next();
	            System.out.println(str);
	            iterator.remove();
	        }
	        System.out.println(list.size());
	    }
}

运行结果

1
2
3
4
0
方法
  • iterator(),list.iterator()用来从容器对象中返回一个指向list开始处的迭代器。
  • next(),获取序列中的下个元素。
  • hasNext(),检查序列中向下是否还有元素。
  • remove(),将迭代器最近返回的一个元素删除。这也意味着调用remove()前需要先调用next()。
实现

设计模式(16)-迭代器模式这一文章中曾讲过,迭代器模式中有四个角色:

  • 抽象聚合类Aggregate。在Vector的Iterator迭代器实现中,没有抽象聚合类。虽然它实现了AbstractList,实现了List,但它向外部提供的创建迭代器的方法iterator()是它自己的。
  • 具体聚合类ConcreteAggregate。在Vector的Iterator迭代器实现中,指的是Vector。
  • 抽象迭代器Iterator。在Vector的Iterator迭代器实现中,指的是Iterator接口。
  • 具体迭代器ConcreteIterator。在Vector中的Iterator迭代器实现中,指的是Itr。

MarkdownPhotos/master/CSDNBlogs/container/5.VectorAndDP/vectorAndIterator.jpg

Vector代码片段

public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
   
	/**
	 * 保存vector中元素的数组。vector的容量是数组的长度,数组的长度最小值为vector的元素个数。
	 * 
	 * 任何在vector最后一个元素之后的数组元素是null。
	 * 
	 * @serial
	 */
    protected Object[] elementData;
	/**
	 * vector中实际的元素个数。
	 * 
	 * @serial
	 */
    protected int elementCount;

	/**
	 * vector需要自动扩容时增加的容量。
	 * 
	 * 当vector的实际容量elementCount将要大于它的最大容量时,vector自动增加的容量。
	 * 
	 * 如果capacityIncrement小于或等于0,vector的容量需要增长时将会成倍增长。
	 * @serial
	 */
    protected int capacityIncrement;

	/**
	 * 序列版本号
	 */
    private static final long serialVersionUID = -2767605614048989439L;
    
    /**
     * 返回一个用来遍历Vector元素的Iterator迭代器
     * 
     * 返回的迭代器是fail-fast的
     */
    public synchronized Iterator<E> iterator() {
   
        return new Itr();
    }

    /**
     * AbstractList.Itr的最优化的版本
     */
    private 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值