zoukankan      html  css  js  c++  java
  • Java基础 -- Collection和Iterator接口的实现

    Collection是描述所有序列容器(集合)共性的根接口,它可能被认为是一个“附属接口”,即因为要表示其他若干个接口的共性而出现的接口。另外,java.util.AbstractCollection抽象类实现了Collection的默认实现,使得我们可以创建AbstractCollection的子类型。

    使用接口描述的一个理由是它可以使我们能够创建更通用的代码。通过针对接口而非具体实现来编写代码,我们的代码可以应用于更多的对象类型。如果编写的方法将接受一个Collection,那么该方法就可以应用于任何实现了Collection的类。

    import java.util.*;
    
    public class InterfaceVsIterator {
    	public static void display(Iterator<Integer> it) {
    		while(it.hasNext()) {
    			int num = it.next();
    			System.out.print(num + "  ");
    		}
    		System.out.println();
    	}
    	
    	
    	public static void display(Collection<Integer> nums) {
    		for(int num : nums){			
    			System.out.print(num + "  ");
    		}
    		System.out.println();
    	}
    	
    	
    	public static void main(String[] args) {
    		List<Integer> list = new ArrayList<Integer>();
    		Collections.addAll(list, 1,2,3,4,5,6,7);
    		
    		display(list);
    		display(list.iterator());
    		
    	}
    	
    }
    

     输出:

    1  2  3  4  5  6  7  
    1  2  3  4  5  6  7  
    

     从上面例子可以看到,Collection接口和Iterator都可以将display()方法与容器底层实现解耦。

     在foreach结构中可以遍历Collection,主要是因为Collection接口实现了Iterable接口,这在Java基础 -- 深入理解迭代器中介绍过。

    一 实现Collection接口

    如果我们想创建一个Collection接口的实现应该怎么办,那么我们必须实现所有Collection方法。但是我们可以通过继承AbstractCollection,就可以简单实现它,这样,我们只需要提供iterator()和size()方法即可:

    import java.util.*;
    
    public class CollectionSequence<T>  extends AbstractCollection<T>{
    	private List<T> ints = new ArrayList<T>();
    	
    	@Override
    	public Iterator<T> iterator() {
    		// TODO Auto-generated method stub
    		return new Iterator<T>() {
    			public int index = 0;
    			
    			@Override
    			public boolean hasNext() {
    				// TODO Auto-generated method stub
    				return index < ints.size();
    			}
    
    			@Override
    			public T next() {
    				// TODO Auto-generated method stub
    				return ints.get(index++);
    			}
    			
    			public void remove() {
    				throw new UnsupportedOperationException();
    			}
    			
    		};
    		
    		
    	}
    
    	@Override
    	public boolean add(T e) {
    		// TODO Auto-generated method stub
    		return ints.add(e);
    	}
    
    	@Override
    	public int size() {
    		// TODO Auto-generated method stub
    		return ints.size();
    	}
    	
    	
    	public static void main(String[] args) {
    		CollectionSequence<Integer> c = new CollectionSequence<Integer>();	
    		Collections.addAll(c, 3,4,3,4,5,6,7);
    		InterfaceVsIterator.display(c);
    		c.add(2000);
    		InterfaceVsIterator.display(c.iterator());
    	}
    
    }
    

     输出:

    3  4  3  4  5  6  7  
    3  4  3  4  5  6  7  2000  
    

    从上面例子可以看到,实现Collection,只需要实现iterator()、size()方法,这是由于继承了AbstractCollection类,所以花费的代价很小。但是,如果你的类已经继承了其他的类,那么就不能再继承AbstractCollection类了。在这种情况下,要实现Collection,就必须实现该接口的所有方法,

    参考文献:

    [1]java编程思想

  • 相关阅读:
    关于vue子组件的数据变了视图不更新的解决办法
    ES5、ES6
    Vue 项目打包上线
    Threejs的学习 1、开启Threejs
    Threejs的学习 2、点,线,面
    Mahalanobis distance
    64位计算机、应用程序和32为计算机、应用程序
    C++编译器无法捕捉到的8种错误(转载)
    最大字段和的扩展最大子矩阵和及最大m字段和问题
    最大字段和各种不同算法实现(参考编程珠玑)
  • 原文地址:https://www.cnblogs.com/zyly/p/10647315.html
Copyright © 2011-2022 走看看