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. Salesforce的对象关系

    对象关系 Salesforce中的对象关系和一般的关系数据库不同. 在关系数据库中对象间的关系是由主键.外键等加以定义.而在Salesforce中,对象之间的关系是由自定义字段来确定. 这么做的原因是 ...

  2. VR一体机如何退出FFBM

            Fast Factory Boot Mode(FFBM)是一种半开机的模式,它的主要目的是方便工厂测试,提高生产效率.正常情况下终端用户是不会碰到的.但售后的同学最近连续收到几台客户退 ...

  3. JS中如何进行对象的深拷贝

    在JS中,一般的=号传递的都是对象/数组的引用,并没有真正地拷贝一个对象,那如何进行对象的深度拷贝呢?如果你对此也有疑问,这篇文章或许能够帮助到你 一.对象引用.浅层拷贝与深层拷贝的区别 js的对象引 ...

  4. Python Learning: 02

    OK, let's continue. Conditional Judgments and Loop if if-else if-elif-else while for break continue ...

  5. i春秋misc部分writeup

    i春秋misc部分writeup 一.敲击 方方格格,然后看到下面的格式,猜测出是键盘上的布局,然后看这些字母形成的形状想那些字母,就是flag了 2.滴滴滴 放到ctfcack里解密,发现时栅栏密码 ...

  6. Java基础系列--05_面向对象

    1.概述: (1)面向过程:将问题一步一步的解决的过程(详细步骤),在C语言中所有的代码都是基于过程化的代码. (2)面向对象:面向对象是基于面向过程的编程思想,所有的事情都交由创建出来的对象去指挥. ...

  7. Codeforces #548 (Div2) - D.Steps to One(概率dp+数论)

    Problem   Codeforces #548 (Div2) - D.Steps to One Time Limit: 2000 mSec Problem Description Input Th ...

  8. WinForms 快速开发的工具类。

    下面是我本人在 WinForms 开发中积累的一些心得. 1. 在父窗体中打开子窗体 直接贴代码: private void btnCompare_Click(object sender, Event ...

  9. P3371 【模板】单源最短路径(弱化版)

    // luogu-judger-enable-o2 #include<cstdio> #include<iostream> #include<algorithm> ...

  10. Docker 核心技术之网络管理

    为什么需要Docker网络管理 容器的网络默认与宿主机.与其他容器都是相互隔离. 容器中可以运行一些网络应用(如nginx.web应用.数据库等),如果要让外部也可以访问这些容器内运行的网络应用,那么 ...