1、迭代器的概述
(1)java中提供了很多个集合,它们在存储元素时,采用的存储方式不同。我们要取出这些集合中的元素,可通过一种通用的获取方式来完成;
(2)Collection集合元素的通用获取方式:在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代;
(3)每种集合的底层的数据结构不同,例如ArrayList是数组,LinkedList底层是链表,但是无论使用那种集合,我们都会有判断是否有元素以及取出里面的元素的动作,那么Java为我们提供一个迭代器定义了统一的判断元素和取元素的方法。
2、迭代器的实现原理
/* * 集合中的迭代器: * 获取集合中元素方式 * 接口 Iterator : 两个抽象方法 * boolean hasNext() 判断集合中还有没有可以被取出的元素,如果有返回true * next() 取出集合中的下一个元素 * * Iterator接口,找实现类. * Collection接口定义方法 * Iterator iterator() * ArrayList 重写方法 iterator(),返回了Iterator接口的实现类的对象 * 使用ArrayList集合的对象 * Iterator it =array.iterator(),运行结果就是Iterator接口的实现类的对象 * it是接口的实现类对象,调用方法 hasNext 和 next 集合元素迭代 */
3、迭代器的代码实现
1 public class IteratorDemo { 2 public static void main(String[] args) { 3 Collection<String> coll = new ArrayList<String>(); 4 coll.add("abc1"); 5 coll.add("abc2"); 6 coll.add("abc3"); 7 coll.add("abc4"); 8 //迭代器,对集合ArrayList中的元素进行取出 9 10 //调用集合的方法iterator()获取出,Iterator接口的实现类的对象 11 Iterator<String> it = coll.iterator(); 12 //接口实现类对象,调用方法hasNext()判断集合中是否有元素 13 //boolean b = it.hasNext(); 14 //System.out.println(b); 15 //接口的实现类对象,调用方法next()取出集合中的元素 16 //String s = it.next(); 17 //System.out.println(s); 18 19 //迭代是反复内容,使用循环实现,循环的条件,集合中没元素, hasNext()返回了false 20 while(it.hasNext()){ 21 String s = it.next(); 22 System.out.println(s); 23 } 24 27 } 28 }
4、迭代器的执行过程
(1)迭代器的原理
1 while(it.hasNext()) { 2 System.out.println(it.next()); 3 } 4 5 //cursor记录的索引值不等于集合的长度返回true,否则返回false 6 public boolean hasNext() { 7 return cursor != size; //cursor初值为0 8 9 } 10 11 //next()方法作用: 12 //①返回cursor指向的当前元素 13 //②cursor++ 14 public Object next() { 15 int i = cursor; 16 cursor = i + 1; 17 return elementData[lastRet = i]; 18 19 }
(2)for循环迭代写法
for (Iterator<String> it2 = coll.iterator(); it2.hasNext(); ) { System.out.println(it2.next()); }
5、集合迭代中的转型
(1)在使用集合时,我们需要注意以下几点:
集合中存储其实都是对象的地址;
集合中可以存储基本数值吗?jdk1.5版本以后可以存储了;
因为出现了基本类型包装类,它提供了自动装箱操作(基本类型?对象),这样,集合中的元素就是基本数值的包装类对象。
(2)存储时提升了Object。取出时要使用元素的特有内容,必须向下转型
1 Collection coll = new ArrayList(); 2 coll.add("abc"); 3 coll.add("aabbcc"); 4 coll.add("shitcast"); 5 Iterator it = coll.iterator(); 6 while (it.hasNext()) { 7 //由于元素被存放进集合后全部被提升为Object类型 8 //当需要使用子类对象特有方法时,需要向下转型 9 String str = (String) it.next(); 10 System.out.println(str.length()); 11 }
注意:如果集合中存放的是多个对象,这时进行向下转型会发生类型转换异常。
(3)Iterator接口也可以使用<>来控制迭代元素的类型的。代码演示如下:
1 Collection<String> coll = new ArrayList<String>(); 2 coll.add("abc"); 3 coll.add("aabbcc"); 4 coll.add("shitcast"); 5 Iterator<String> it = coll.iterator(); 6 while (it.hasNext()) { 7 String str = it.next(); 8 //当使用Iterator<String>控制元素类型后,就不需要强转了。获取到的元素直接就是String类型 9 System.out.println(str.length()); 10 }