Java 集合-Collection接口和迭代器的实现
2017-10-30 00:30:48
- Collection接口
Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作collection。
- 所有超级接口:
- Iterable<E>
- 所有已知子接口:
- BeanContext, BeanContextServices, BlockingDeque<E>, BlockingQueue<E>, Deque<E>, List<E>, NavigableSet<E>, Queue<E>, Set<E>, SortedSet<E>
- 所有已知实现类:
- AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList, BeanContextServicesSupport, BeanContextSupport, ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DelayQueue, EnumSet, HashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, Stack, SynchronousQueue, TreeSet, Vector

Collection接口方法测试:
由于Collection是接口且没有可以实现的儿子,所以使用ArrayList进行测试。
public class Demo2
{
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("Hello");
c.add("World"); // c.clear(); c.remove("World");
System.out.println(c.contains("Hello"));
System.out.println(c.isEmpty());
System.out.println(c.size());
System.out.println(c);
}
}
这里需要关注一下retainAll()的方法,该方法为求两个集合的交集。例如,A对B做交集,那么交集集合放在A中,返回值的布尔类型表示的是A有没有发生变化,如果发生的变化则返回False,如果没有变化则返回True。
集合的遍历:
1、Object[] toArray():把集合转成数组,可以实现集合的遍历
import java.util.ArrayList;
import java.util.Collection; public class Demo2 {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("Hello");
c.add("World");
c.add("!"); Object[] obj = c.toArray();
for (int i = 0; i < obj.length; ++i) {
System.out.println(obj[i]);
}
} }
2、Iterator iterator():迭代器,集合的专用遍历方式,迭代器依赖于集合而存在
Iterator:对 collection 进行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同:
- 迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素。
- 方法名称得到了改进。
接口 Iterator为什么不是一个类的原因:假设迭代器定义是一个类,这样我们就可以使用类对象,调用该类的对象的方法就可以实现集合的遍历操作。然而,集合中是有很多的不同类型的数据结构组成的集合类的,诸如hashtable,红黑树等,显然无法使用一个通用的hasnext(),或者next()方法进行调用,所以并没有将迭代器定义为一个类。而无论是那种集合,都是需要具备集合的元素获取和遍历操作的,并且最好辅助判断功能。也就是说集合的获取和判断是每个集合类都需要的,但是各个类又有自己的不同的实现方式,所以将Iterator定义成了一个接口。事实上,Collection并不是最终的根节点,它还继承了一个超级接口Iterable。而Iterator中的具体实现则是在各个Collection的实现类中以一种内部类的方式进行实现的。
public interface Interable
{
Iterator iterator();
} public interface Interator
{
public boolean hasNext();
public Object next();
} public interface Collection extends Iterable
{
Iterator iterator();
} public interface List extends Collection
{
Iterator iterator();
} public class ArrayList implements List
{
public Iterator iterator(){
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount; // prevent creating a synthetic constructor
Itr() {} public boolean hasNext() {
return cursor != size;
} @SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
} public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification(); try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
} }
常用方法:

public void demo1()
{
Collection c = new ArrayList();
c.add("Hello");
c.add("World");
c.add("!"); Iterator it = c.iterator(); //多态
while(it.hasNext())
{
System.out.println(it.next());
}
}
使用for循环改写,可以方便迭代器在for循环后销毁。
public void demo1()
{
Collection c = new ArrayList();
c.add("Hello");
c.add("World");
c.add("!"); // Iterator it = c.iterator();
// while(it.hasNext())
// {
// System.out.println(it.next());
// } for(Iterator it=c.iterator();it.hasNext();)
{
System.out.println(it.next());
}
}
Java 集合-Collection接口和迭代器的实现的更多相关文章
- java集合——Collection接口
Collection是Set,List接口的父类接口,用于存储集合类型的数据. 2.方法 int size():返回集合的长度 void clear():清除集合里的所有元素,将集合长度变为0 Ite ...
- JAVA集合--Collection接口
本文首发于cartoon的博客 转载请注明出处:https://cartoonyu.github.io/cartoon-blog 在概述里面也说过:Collection是jav ...
- java集合Collection接口
collection集合 Map集合 Hashtable和HashMap的区别: Hashtable的方法是同步的,而HashMap的方法不是.HashMap可以将空值作为一个表的条目的key或val ...
- Java集合Map接口与Map.Entry学习
Java集合Map接口与Map.Entry学习 Map接口不是Collection接口的继承.Map接口用于维护键/值对(key/value pairs).该接口描述了从不重复的键到值的映射. (1) ...
- Java—包装类/System类/Math类/Arrays类/大数据运算/Collection接口/Iterator迭代器
基本类型包装类 8种基本类型对应的包装类如: 将字符串转成基本类型: 将基本数值转成字符串有3种方式: 基本类型直接与””相连接即可:34+" " 调用String的valueOf ...
- Java中的集合Collection接口
/* 集合:集合是存储对象数据的集合容器.集合比数组的优势: 1. 集合可以存储任意类型的对象数据,数组只能存储同一种数据类型 的数据. 2. 集合的长度是会发生变化的,数组的长度是固定的.----- ...
- Java之Collection接口(单列集合根接口)
集合概述 集合到底是什么呢?集合:集合是java中提供的一种容器,可以用来存储多个数据 集合和数组既然都是容器,它们有啥区别呢? 区别1: 数组的长度是固定的. 集合的长度是可变的. 区别2: 数组 ...
- 集合--Collection接口详解&&迭代器
/* * 集合的顶层接口--Collection接口 * 添加 * add() * addAll() * * 遍历集合 * iterator() 迭代器 * * 删除 * remove() * rem ...
- JAVA ,Map接口 ,迭代器Iterator
1. Map 接口概述 java.util.Map 接口描述了映射结构, Map 接口允许以键集.值集合或键 - 值映射关系集的形式查看某个映射的内容. Java 自带了各种 Map 类. 这些 ...
随机推荐
- webapi swagger学习笔记
版权声明:部分摘抄其他博主朋友的博文内容,旨在分享学习,如给您带来不便,请原谅.原文地址 http://www.cnblogs.com/yanweidie/p/5709113.html#_label3 ...
- VS2010/MFC编程入门之四十二(MFC常用类:CString类)
上一节鸡啄米讲了分割窗口的有关知识,本节开始讲解MFC的一些常用类,先来说说CString类. CString类简介 CString类作为MFC的常用类,当之无愧.可以这样说,只要是从事MFC开发,基 ...
- 成本安全硬件(二):RFID on PN532 之WINDOWS 环境应用
看了 低成本安全硬件(二):RFID on PN532之后,手上也有树莓派,于是下单买了个PN532 按文章方法,安装各类软件 ,折腾好好几天 还是不得行,LINUX 环境够乱啊 在网络 重新搜索,基 ...
- 论文笔记:2018 PRCV 顶会顶刊墙展
Global Gated Mixture of Second-order Pooling for Imporving Deep Convolutional Neural Network(2018 NI ...
- linux常用命令(替换)
1. vi 模式下的替换命令: s 表示替换(substitute),g表示全局搜索(global search) :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vi ...
- 学写网页 #05# CSS Mastery 笔记 1~3
看到第四章才发现这本书已经太旧了..看到第 3 章为止吧.前三章主要讲的内容:一些编码常识.怎样选择元素.盒子模型(主要是 Margin).定位(绝对.相对.浮动.fixed 等) 第一章 conve ...
- Python入门之logging模块
本章目录: 一.logging模块简介 二.logging模块的使用 三.通过JSON或者YMAL文件配置logging模块 ===================================== ...
- Linux系统下(x64)安装jdk 1.6(jdk-6u45-linux-x64.bin)
Linux系统下(x64)安装jdk 1.6(jdk-6u45-linux-x64.bin) 一,查看是否安装jdk: # rpm -qa | grep jdk 或者 #rpm -q jdk 或者 # ...
- 20145335郝昊《网络攻防》Exp4 MS11_050
20145335郝昊<网络攻防>Exp4 MS11_050 实验内容 初步掌握平台matesploit的使用 了解漏洞MS11_050漏洞:use-after-free漏洞,即对象被释放之 ...
- 探索Java8:(二)Function接口的使用
Java8 添加了一个新的特性Function,顾名思义这一定是一个函数式的操作.我们知道Java8的最大特性就是函数式接口.所有标注了@FunctionalInterface注解的接口都是函数式接口 ...