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 类. 这些 ...
随机推荐
- wordpress 修改域名后的403
wordpress的好处就是方便,不好呢,额,反正就是有. 最近,修改域名,也遇到了这个问题[修改域名后,出现403]. 网上的办法似乎有很多,但有一些并不好,比如修改数据库什么的,如果是新手,数据库 ...
- Java设计模式应用——策略模式
对于相同类型相同类型的输入输出,在不同场景下需要使用不同的逻辑处理,则可以使用策略模式. 比如排序算法有堆排序,快速排序,冒泡排序,选择排序等.为了保证排序效率,需要在不同场景下选择不同排序算法,这时 ...
- 贪婪算法(Greedy Algorithm)
Greedy Algorithm <数据结构与算法--C语言描述> 图论涉及的三个贪婪算法 Dijkstra 算法 Prim 算法 Kruskal 算法 Greedy 经典问题:coin ...
- VC++实现程序重启的方法(转载)
转载:http://blog.csdn.net/clever101/article/details/9327597 很多时候系统有很多配置项,修改了配置项之后能有一个按钮实现系统重启.所谓重启就是杀死 ...
- compile vi from source code
1.install ncurses library (vi depend on ncurses library) ./configure --prefix=/usr --with-termlib m ...
- json字符窜转对象
第一种方法: 注意引用:using System.Runtime.Serialization.Json; using System.IO; static void Main(string[] args ...
- 精巧好用的DelayQueue 转
我们谈一下实际的场景吧.我们在开发中,有如下场景 a) 关闭空闲连接.服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之.b) 缓存.缓存中的对象,超过了空闲时间,需要从缓存中移出.c) 任务超 ...
- 将一组数组向右移动k位,末尾的要转置移动到数组开始,其中n为数组大小,0<k<n
下面是使用a数组本身完成: package 数组元素k位右移; /** * 数组向又移动k位. 0<k<n * * @author SeeClanUkyo 将一组数组向右移动k位,末尾的要 ...
- 【Coursera】Security Introduction -Ninth Week(2)
对于公钥系统,我们现在已经有了保证它 Confidentially 的一种方法:SSL.SSL利用了公钥的概念. 那么 who we are talking to? Integrity Certifi ...
- UVa 3349 Snowflake Snow Snowflakes(Hash)
http://poj.org/problem?id=3349 题意: 给出n片雪花留个角的长度,要求判断是否有一样的雪花. 思路: Hash表的应用. 首先将每个雪花所有角的总长计算出来,如果两片雪花 ...