Iterable和迭代器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37256896/article/details/82961150

Iterable

正是由于每一个容器都有取出元素的功能。这些功能定义都一样,只不过实现的具体方式不同(因为每一个容器的数据结构不一样)所以对共性的取出功能进行了抽取,从而出现了Iterator接口。而每一个容器都在其内部对该接口进行了内部类的实现。也就是将取出方式的细节进行封装。

Jdk1.5之后添加的新接口, Collection的父接口实现了Iterable的类就是可迭代的.并且支持增强for循环。该接口只有一个方法即获取迭代器的方法iterator()可以获取每个容器自身的迭代器Iterator。(Collection)集合容器都需要获取迭代器(Iterator)于是在5.0后又进行了抽取将获取容器迭代器的iterator()方法放入到了Iterable接口中。Collection接口进程了Iterable,所以Collection体系都具备获取自身迭代器的方法,只不过每个子类集合都进行了重写(因为数据结构不同)

2.迭代器的遍历

第一种方式:while循环

[java] view plain copy

 print?

  1. public static void main(String[] args) {  
  2.         ArrayList list = new ArrayList();  
  3.         // 增加:add() 将指定对象存储到容器中  
  4.         list.add("计算机网络");  
  5.         list.add("现代操作系统");  
  6.         list.add("java编程思想");  
  7.         list.add("java核心技术");  
  8.         list.add("java语言程序设计");  
  9.         System.out.println(list);  
  10.         Iterator it = list.iterator();  
  11.         while (it.hasNext()) {  
  12.             String next = (String) it.next();  
  13.             System.out.println(next);  
  14.         }  
  15.     }  

第二种方式:for循环

[java] view plain copy

 print?

  1. public class Demo2 {  
  2.     public static void main(String[] args) {  
  3.         ArrayList list = new ArrayList();  
  4.         // 增加:add() 将指定对象存储到容器中  
  5.         list.add("计算机网络");  
  6.         list.add("现代操作系统");  
  7.         list.add("java编程思想");  
  8.         list.add("java核心技术");  
  9.         list.add("java语言程序设计");  
  10.         System.out.println(list);  
  11.   
  12.         for (Iterator it = list.iterator(); it.hasNext();) {  
  13.              //迭代器的next方法返回值类型是Object,所以要记得类型转换。  
  14.             String next = (String) it.next();  
  15.             System.out.println(next);  
  16.         }  
  17.     }  
  18. }  

需要取出所有元素时,可以通过循环,java 建议使用for 循环。因为可以对内存进行一下优化。

第三种方式:使用迭代器清空集合

[java] view plain copy

 print?

  1. public class Demo1 {  
  2.     public static void main(String[] args) {  
  3.         Collection coll = new ArrayList();  
  4.         coll.add("aaa");  
  5.         coll.add("bbb");  
  6.         coll.add("ccc");  
  7.         coll.add("ddd");  
  8.         System.out.println(coll);  
  9.         Iterator it = coll.iterator();  
  10.         while (it.hasNext()) {  
  11.             it.next();  
  12.             it.remove();  
  13.         }  
  14.         System.out.println(coll);  
  15.     }  
  16. }  

容器:Java中有的容器有List, Queue, Map, 下面对List 的介绍:List接口在Collection 的基础上进行添加大量的方法,使得list的中间可以插入和移除元素,类型如下:1ArrayList,它是随机访问元素,在中间删除,插入元素时较慢。

2LinkedList, 中间删除,插入元素时较快。访问较慢,

1.在这些集合中可以用contains()方法确定某个对象是否存在,

移除对象用remove(引用)还可以用对象的引用来使用indexOf(),发现对象中的索引位置,

  • add(E e) 将指定的元素追加到此列表的末尾。
  • remove(int index) 删除该列表中指定位置的元素 
  • set(int index, E element) 用指定的元素替换此列表中指定位置的元素。
  • toArray() 以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。
  • get(int index) 返回此列表中指定位置的元素。
  • iterator() 以正确的顺序返回该列表中的元素的迭代器。

迭代器:

遍历并选择序列的对象,不必知道底层结构,Iterator只能单向移动,只可以用以下的方式:1使用方法Iterator()要求容器返回一个Iterator,Iterator 将准备好返回序列的第一个元素2使用next()获得序列中的下一个元素3使用hasnext()检查序列中是否有元素4使用remove()将迭代器新序列返回的元素删除。remove() 从底层集合中删除此迭代器返回的最后一个元素;此方法只能调用一次next() 。 如果底层集合在迭代过程中以任何方式进行修改而不是通过调用此方法,则迭代器的行为是未指定的。 实现要求: 默认的实现抛出的一个实例UnsupportedOperationException并执行其他操作。

例如:

//遍历方式一

List<Pet> pets=Pets.arrayList(12);

Iterator<Pet> it=pets.iterator();

while(it.hasNext()){

Pet p=it.next();

sysout(p.id());

}

//遍历方式二

for(Pet p:pets){

sysout(p.id());

}

 

//遍历方式三

Iterator<Pet> it=pets.iterator();

for(int i=0;i<6;i++){

it.next();

it.remove();

}

其实在迭代器在平时的用法还真的挺多的,多加以实践和练习;

猜你喜欢

转载自blog.csdn.net/qq_37256896/article/details/82961150