import java.util.*;
public class Test {
public static void main(String []args) {
ArrayList arrlist = new ArrayList();
Iterator<String> itr = arrlist.iterator();
String str1 = "Think before you act.\n";
String str2 = "full of courtesy,full of craft.\n";
String str3 = "Best is cheapest.\n";
String str4 = "Look before you leap.\n";
String str5 = "take time when time comes.\n";
arrlist.add(str1);
arrlist.add(str2);
arrlist.add(str3);
arrlist.add(str4);
arrlist.add(str5);
System.out.println("输出集合内容");
while(itr.hasNext())
System.out.println(itr.next()+"\n");
}
}
Iterator<String> itr = arrlist.iterator(); // 这句话为什么非要写在加入集合元素的后面.如果前在前面会总出问题.iterator();这个函数的作用是什么,我理解是把实现List接口的对象转换成实现Iterator接口的对象,可是一想又不对,为什么这么想呢,首先,书里写到set list.map都已经实现了接口Iterator,这点我又不明白了,接口可以实现接口的吗?我认为不能.可是他为什么这么说呢?其二,如果就算书上写到他们三个接口都已经实现了Iterator接口,好像就没有必要用arrlist.iterator();函数转换了吧.我认为直接就可以写Iterator<String> itr = arrlist; 还有itr不单单是个引用吗?如果是一个引用按理说加元素前后再转换都无所谓了.各位理解明白大哥们帮我解释下吧.
public class Test {
public static void main(String []args) {
ArrayList arrlist = new ArrayList();
Iterator<String> itr = arrlist.iterator();
String str1 = "Think before you act.\n";
String str2 = "full of courtesy,full of craft.\n";
String str3 = "Best is cheapest.\n";
String str4 = "Look before you leap.\n";
String str5 = "take time when time comes.\n";
arrlist.add(str1);
arrlist.add(str2);
arrlist.add(str3);
arrlist.add(str4);
arrlist.add(str5);
System.out.println("输出集合内容");
while(itr.hasNext())
System.out.println(itr.next()+"\n");
}
}
Iterator<String> itr = arrlist.iterator(); // 这句话为什么非要写在加入集合元素的后面.如果前在前面会总出问题.iterator();这个函数的作用是什么,我理解是把实现List接口的对象转换成实现Iterator接口的对象,可是一想又不对,为什么这么想呢,首先,书里写到set list.map都已经实现了接口Iterator,这点我又不明白了,接口可以实现接口的吗?我认为不能.可是他为什么这么说呢?其二,如果就算书上写到他们三个接口都已经实现了Iterator接口,好像就没有必要用arrlist.iterator();函数转换了吧.我认为直接就可以写Iterator<String> itr = arrlist; 还有itr不单单是个引用吗?如果是一个引用按理说加元素前后再转换都无所谓了.各位理解明白大哥们帮我解释下吧.
是继承,不是实现
Iterator<String> itr = arrlist.iterator(); // 这句话为什么非要写在加入集合元素的后面.如果前在前面会总出问题.
能不能说详细一点呢?“为什么非要写在加入集合元素的后面”是什么意思?
iterator();这个函数的作用是什么,我理解是把实现List接口的对象转换成实现Iterator接口的对象,
这个并不是将 List 对象转换成为 Iterator 对象,而是将返回一个可以用于迭代 List 中存放元素的迭代器。由于各种 List 的实现都不一样,有用数组实现的 ArrayList,有使用链表实现的 LinkedList,那这两种实现要进行其中元素遍历的话,使用的方式肯定是不一样的(ArrayList 使用数组下标索引遍历,LinkedList 使用链表指针遍历)。如果是这样的话,我们就没有办法统一对各种 List 的实现来进行内部元素的遍历了,因此我们就需要对于遍历采取统一的模式,这样的话就产生了一个 Iterator 的接口。对于 ArrayList 来说,它的 Iterator 实现中 next() 肯定是将其内部索引增加一个,而 LinkedList Iterator 的实现中 next() 肯定是通过当前节点的下一节点。Iterator 存在的目的是为了适应不同 List 甚至是集合的实现,而定义的一个迭代集合内部元素的高层抽象。有了 Iterator 我们并不需要考虑其内部是用数组、链表还是红黑树实现的,内部是如何遍历的。Iterator 在这里的应用就充分地将具体的实现与迭代的方式耦合程度降至最低了。
接口可以实现接口的吗?我认为不能.可是他为什么这么说呢?
接口不能实现接口,但接口可以继承接口,甚至可以继承多个接口。我一般把接口继承了另一个接口称为接口扩展了另一个接口,呵呵。
其二,如果就算书上写到他们三个接口都已经实现了Iterator接口,好像就没有必要用arrlist.iterator();函数转换了吧.我认为直接就可以写Iterator<String> itr = arrlist;
类型不同,不能直接这样强转的。因为 List 扩展了 Iterable 接口,并没有扩展 Iterator 接口。有兴趣的话,可以去看看 java.lang.Iterable 和 java.util.Iterator 这两个接口的 API 文档,看看这两个接口有些啥关系。再想一下为什么要这样?
如果我说得不清楚,或者你还有什么不清楚的地方,在下面回复一下吧。