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 类. 这些 ...
随机推荐
- Perl中的哈希(四)
Perl中的哈希数据结构.相比较于数组,这种数据结构对于数据查找和统计更加方便. 一个特殊的哈希,%ENV,表示当前terminal下,通过setenv设置的variable的键值. 键:环境变量名, ...
- php判断数组元素是否存在某个字符串的方法
php判断数组元素是否存在某个字符串的方法: 方法一:采用in_array(value,array,type) type 可选.如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同. ...
- Python入门之logging模块
本章目录: 一.logging模块简介 二.logging模块的使用 三.通过JSON或者YMAL文件配置logging模块 ===================================== ...
- SQL学习之SqlMap SQL注入
sqlmap也是渗透中常用的一个注入工具,其实在注入工具方面,一个sqlmap就足够用了,只要你用的熟,秒杀各种工具,只是一个便捷性问题,sql注入另一方面就是手工党了,这个就另当别论了. 今天把我一 ...
- Antlr4 入门
一.ANTRL 是什么 ANTLR 是用JAVA写的语言识别工具,它用来声明语言的语法,简称为“元语言”(meta-language). ANTLR 语法识别一般分为二个阶段: 1.词法分析阶段 (l ...
- shell分析http日志
http状态码1字头----信息,服务器收到请求,需要请求者继续执行操作2字头----成功,操作被成功接收并处理3字头----重定向,需要进一步的操作以完成请求4字头----客户端错误,请求包含语法错 ...
- 05:ModelForm 数据验证 & 生成html & 数据库操作
目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...
- vs2012添加自定义资源步骤
1.新建Win32工程 2.选中Resource Files -> add resource 点击打开 这里需要你填写一个Resource Type ,假如你之前已经有了,就直接输入,没有的话在 ...
- Python3基础 os.path.splitext 处理文件名,得到文件名+扩展名
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- SQL Over
与over函数结合的几个函数 create table #tab(A varchar(), B varchar()) insert into #tab select 'A1', 'B1' union ...