Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList

Java Iterator模式 Java Iterator模式, 模仿Collectin ArrayList LinckedList

一、有如下几个类

1.接口Collection.java

2.接口Iterator.java

3.ArrayList.java

4.LinkedList.java

5.Node.java

关系如下:

Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList

代码如下:

1.接口Collection.java

public interface Collection<E> {
	public void add(E e);
	public int size();
	public Iterator iterator();
}

  

2.ArrayList.java

public class ArrayList<E> implements Collection<E>{

	//先给定一个长度为10的数组
	Object [] objects = new Object[10];
	
	//冗余一个int指数,方便判定是组是否为满和返回集合大小
	int index = 0;

	@Override
	//1.动态添加元素
	public void add(E e) {
		
		//1.1先判断数组是否已满
		if(index == objects.length){
			Object [] newObjects = new Object[objects.length*2];
			System.arraycopy(objects, 0, newObjects, 0, objects.length);
			objects = newObjects;	//数组是引用数据类型
		}
		
		//1.2为新添加的元素指定下标
		objects[index] = e;
		
		//1.3index自加1,以方便返回集合在大小
		index++;
	}

	//2.根据下标访问元素
	
	@Override
	//3.返回集合大小
	public int size() {
		return index;
	}

	@Override
	public Iterator iterator() {
		return new ArrayListIterator();
	}
	
	private class ArrayListIterator implements Iterator {

		private int currentIndex = 0;
		
		@Override
		public Object next() {
			// 返回最下一个元素
			Object o = objects[currentIndex];
			currentIndex++;
			return o;
		}

		@Override
		public boolean hasNext() {
			// 判断是否为最后一个元素
			
			if(currentIndex >= index){
				return false;
			}
			return true;
		}
		
	}
	
}

  

3.LinkedList.java

public class LinkedList<E> implements Collection<E> {

	private Node head;
	private Node tail;
	private int size;
	
	public void add(E e){
		Node n = new Node(e, null);
		if(head == null){
			head = n;
			tail = n;
			size++;
		} else {
			tail.setNext(n);
			tail = n;
			size++;
		}
	}
	
	public int size(){
		return size;
	}

	@Override
	public Iterator iterator() {
		return new LinkedListIterator();
	}
	
	private class LinkedListIterator implements Iterator {

		private Node currentNode = head;
		
		@Override
		public Object next() {
			Object o = currentNode.getData();
			currentNode = currentNode.getNext();
			return o;
		}

		@Override
		public boolean hasNext() {
			if(currentNode.getNext() == null){
				return false;
			}
			return true;
		}
		
	}
}

4.Node.java

public class Node {
	
	private Object data;
	private Node next;
	
	public Node(Object data, Node next) {
		super();
		this.data = data;
		this.next = next;
	}

	public Object getData() {
		return data;
	}

	public void setData(Object data) {
		this.data = data;
	}

	public Node getNext() {
		return next;
	}

	public void setNext(Node next) {
		this.next = next;
	}
	
	
}

5.Iterator.java

public interface Iterator {
	public Object next();
	public boolean hasNext();
}

6.Dog.java

public class Dog {
	private int id;

	public Dog(int id) {
		super();
		this.id = id;
	}
	
	@Override
	public String toString() {
		return "Dog"+id;
	}
}

7.测试类CollectionTest.java

public class CollectionTest {

	@Test
	public void test() {
		Collection co = new LinkedList();
		for(int i = 0 ;i < 15 ;i++){
			co.add(new Dog(i));
		}
		System.out.println(co.size());
		
		Iterator it = co.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

}

运行结果

Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList