1.有一个集合,代码如下:
Collection c=new ArrayList();
c.add("Go");
c.add("WuHan");
c.add("Go");
c.add("Chian");
分别使用数组与迭代器的方式编程实现:遍历集合中的每一个元素,输出每一个元素的内容和长度。
1)数组方式
1 Object[] obj=c.toArray(); 2 3 for(Object o:obj){ 4 5 System.out.println(o+"----"+((String)o).length()); 6 7 }
2)迭代器方式
1 Iterator it=c.iterator(); 2 3 while(it.hasNext()){ 4 5 String s=(String)it.next(); 6 7 System.out.println(s+"----"+s.length()); 8 9 }
2.编程实现一个Collection存储自定义对象并遍历的案例要求如下:自定义对象可任意;使用Iterator迭代器;分别使用while和for循环进行遍历。
1 //while循环遍历 2 3 Iterator it=c.iterator(); 4 5 while(it.hasNext()){ 6 7 String s=(String)it.next(); 8 9 System.out.println(s+"----"+s.length()); 10 11 }
1 //for循环遍历 2 3 for(Iterator it=c.iterator();it.hasNext();){ 4 5 String s=(String)it.next(); 6 7 System.out.println(s+"----"+s.length()); 8 9 }
3.简述集合的使用步骤。
(1) 创建集合对象
(2) 创建元素对象
(3) 把元素添加到集合
(4) 遍历集合
1) 通过集合对象获取迭代器对象
2) 通过迭代器对象的hasNext()方法判断是否有元素
3) 通过迭代器对象的next()方法获取元素并移动到下一个位置
4.Iterator迭代器为什么不定义成一个类,而是一个接口?找到JDK中Iterator接口的next()方法的具体实现源码?
(1)假迭代器定义为一个类,首先若是具体类那么就会提供一个公共的实现不同集合遍历的方法,这是不可能的。集合类的数据结构是不同的,所以,存储的方式和遍历的方式应该是不同的。进而它们的遍历方式也应该不是一样的,所以,就没有定义迭代器类。
而无论你是哪种集合,你都应该具备获取元素的操作,并且,最好在辅助于判断功能,这样,在获取前,先判断。这样就跟不容易出错。也就是说,判断功能和获取功能应该是一个集合遍历所具备的,而每种集合的方式又不太一样,所以我们把这两个功能给提取出来,并不提供具体实现,这种方式就是接口。
其实迭代器的具体实现方法是在集合的具体子类中以内部类的方式实现。
(2)terator接口中的next()方法的具体实现源码
1 public E next() { 2 3 checkForComodification(); 4 5 int i = cursor; 6 7 if (i >= size) 8 9 throw new NoSuchElementException(); 10 11 Object[] elementData = ArrayList.this.elementData; 12 13 if (i >= elementData.length) 14 15 throw new ConcurrentModificationException(); 16 17 cursor = i + 1; 18 19 return (E) elementData[lastRet = i]; 20 21 }