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编程思想

Java基础 -- Collection和Iterator接口的实现的更多相关文章

  1. Java API ——Collection集合类 & Iterator接口

    对象数组举例: 学生类: package itcast01; /** * Created by gao on 15-12-9. */ public class Student { private St ...

  2. Java基础-Collection子接口之Set接口

    Java基础-Collection子接口之Set接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学习Collection接口时,记得Collection中可以存放重复元素,也可 ...

  3. Java基础-Collection子接口之List接口

    Java基础-Collection子接口之List接口 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们掌握了Collection接口的使用后,再来看看Collection接口中 ...

  4. java基础-迭代器(Iterator)与增强for循环

    java基础-迭代器(Iterator)与增强for循环 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Iterator迭代器概述 Java中提供了很多个集合,它们在存储元素时 ...

  5. Java基础之抽象类与接口

    Java基础之抽象类与接口 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候 ...

  6. java集合 之 Collection和Iterator接口

    Collection是List,Queue和Set接口的父接口,该接口里定义的方法即可用于操作Set集合,也可以用于List和Queue集合.Collection接口里定义了如下操作元素的方法. bo ...

  7. Java基础——collection接口

    一.Collection接口的定义 public interfaceCollection<E>extends iterable<E>  从接口的定义中可以发现,此接口使用了泛型 ...

  8. Java容器深入浅出之Collection与Iterator接口

    Java中用于保存对象的容器,除了数组,就是Collection和Map接口下的容器实现类了,包括用于迭代容器中对象的Iterator接口,构成了Java数据结构主体的集合体系.其中包括: 1. Co ...

  9. java集合(2)-Collection与Iterator接口

    1 package com.j1803.collectionOfIterator; 2 import java.util.ArrayList; 3 import java.util.Collectio ...

随机推荐

  1. EF时,数据库字段和实体类不一致问题

    场景:由于一些原因,实体中属性比数据库中字段多了一个startPage属性.PS:controllers中用实体类去接收参数,但是传入的参数比数据库中实体表多了一个字段, 这种情况下,应该建一个vie ...

  2. vue 单文件组件中样式加载

    在写单文件组件时,一般都是把标签.脚本.样式写到一起,这样写个人感觉有点不够简洁,所以就想着把样式分离出去. 采用import加载样式 在局部作用域(scoped)采用@import加载进来的样式文件 ...

  3. Scrapy 框架流程详解

    框架流程图 Scrapy 使用了 Twisted 异步非阻塞网络库来处理网络通讯,整体架构大致如下(绿线是数据流向): 简单叙述一下每层图的含义吧: Spiders(爬虫):它负责处理所有Respon ...

  4. kubeadm快速搭建k8s集群

    环境 master01:192.168.1.110 (最少2核CPU) node01:192.168.1.100 规划 services网络:10.96.0.0/12 pod网络:10.244.0.0 ...

  5. Django入门之路

    Web框架开发-Django基础之web应用,Http协议 web框架开发-web框架简介,wsgiref模块,DIY一个web框架 web框架开发-Django简介 web框架开发-静态文件配置 w ...

  6. As-If-Serial 理解

    as-if-serial语义的意思指: 不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变.编译器,runtime 和处理器都必须遵守as-if-serial语义.为了 ...

  7. pytorch的函数中的dilation参数的作用

    如果我们设置的dilation=0的话,效果如图: 蓝色为输入,绿色为输出,可见卷积核为3*3的卷积核 如果我们设置的是dilation=1,那么效果如图: 蓝色为输入,绿色为输出,卷积核仍为3*3, ...

  8. 1、roboguide新建工程文件

    打开roboguide,软件界面如下,接下来讲解一下“打开和新建工程文件” 首先介绍一下新建工程文件,在工具栏中点击新建按钮或者在文件(file)的下拉菜单中点击新建工程文件(new cell),弹出 ...

  9. 几个不常用的C++关键字

    volatile 遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问. 所以说volatile可以保证对特殊地址的稳定访问. mutable 如果需要在 ...

  10. asp.net获取当前请求的url

    asp.net获取当前请求的url 设当前页完整地址是:http://www.dgshop.com/Home/Manager?id=2&para=ASFDG [1]获取 完整url 代码如下: ...