下面这个程序是可以编译运行的.此程序演示了接口Iterator的运用.
这个程序的一些代码我不能理解,希望大侠给指点指点(问题已在程序中注明).谢谢了!
import java.util.Iterator;
import java.util.Collection;
import java.util.ArrayList;class Chart implements Comparable {
public int number;
public String name;
public long scale; public Chart(int number,String name,long scale){
this.number=number;
this.name=name;
this.scale=scale;
}
public int compareTo(Object o){
Chart other=(Chart)o;
//return name.compareTo(other.name); //根据name来排序
return (scale<other.scale? 1:(scale==other.scale? 0:-1)); //根据scale来排序
//return (number<other.number? 1:(scale==other.number? 0:-1)); //根据number来排序
//设置返回值可以实现逆序排序
}
public String toString(){
return number+" "+name+" "+" 1:"+scale;
}
}class IteratorDemo{
public static void showContainer(Collection c){
Chart achart;
Iterator I=c.iterator(); //疑问??(Iterator是接口为什么可以实例化)
while(I.hasNext()){
achart=(Chart)I.next();
System.out.println(achart.toString());
}
} public static void main(String args[]) {
// Construct the container
ArrayList charts = new ArrayList();
// Insert some Data objects
charts.add(new Chart(11013, "Morehead City Hrbr ", 12500));
charts.add(new Chart(11552, "Neuse River ", 40000));
charts.add(new Chart(11428, "Dry Tortugas ", 30000));
charts.add(new Chart(11420, "Havana to Tampa Bay", 470940));
charts.add(new Chart(25641, "Virgin Islands ", 100000));
charts.add(new Chart(26341, "Bermuda Islands ", 50000));
System.out.println("\nCharts shown by an Iterator object");
showContainer(charts);//疑问??(showContainer(Collection c)为什么可以接受参数:charts)
Iterator I=charts.iterator();
if(I.hasNext()){
Chart c=(Chart)I.next();
I.remove();
}
System.out.println("\nAfter removing first object");
showContainer(charts);
I=charts.iterator();
while(I.hasNext()){
I.next();
I.remove();
}
System.out.print("\nAfter removing all objects");
System.out.println("Container size= "+charts.size());
}
}
这个程序的一些代码我不能理解,希望大侠给指点指点(问题已在程序中注明).谢谢了!
import java.util.Iterator;
import java.util.Collection;
import java.util.ArrayList;class Chart implements Comparable {
public int number;
public String name;
public long scale; public Chart(int number,String name,long scale){
this.number=number;
this.name=name;
this.scale=scale;
}
public int compareTo(Object o){
Chart other=(Chart)o;
//return name.compareTo(other.name); //根据name来排序
return (scale<other.scale? 1:(scale==other.scale? 0:-1)); //根据scale来排序
//return (number<other.number? 1:(scale==other.number? 0:-1)); //根据number来排序
//设置返回值可以实现逆序排序
}
public String toString(){
return number+" "+name+" "+" 1:"+scale;
}
}class IteratorDemo{
public static void showContainer(Collection c){
Chart achart;
Iterator I=c.iterator(); //疑问??(Iterator是接口为什么可以实例化)
while(I.hasNext()){
achart=(Chart)I.next();
System.out.println(achart.toString());
}
} public static void main(String args[]) {
// Construct the container
ArrayList charts = new ArrayList();
// Insert some Data objects
charts.add(new Chart(11013, "Morehead City Hrbr ", 12500));
charts.add(new Chart(11552, "Neuse River ", 40000));
charts.add(new Chart(11428, "Dry Tortugas ", 30000));
charts.add(new Chart(11420, "Havana to Tampa Bay", 470940));
charts.add(new Chart(25641, "Virgin Islands ", 100000));
charts.add(new Chart(26341, "Bermuda Islands ", 50000));
System.out.println("\nCharts shown by an Iterator object");
showContainer(charts);//疑问??(showContainer(Collection c)为什么可以接受参数:charts)
Iterator I=charts.iterator();
if(I.hasNext()){
Chart c=(Chart)I.next();
I.remove();
}
System.out.println("\nAfter removing first object");
showContainer(charts);
I=charts.iterator();
while(I.hasNext()){
I.next();
I.remove();
}
System.out.print("\nAfter removing all objects");
System.out.println("Container size= "+charts.size());
}
}
iterator()返回在此 collection 的元素上进行迭代的迭代器。关于元素返回的顺序没有任何保证(除非此 collection 是某个能提供保证顺序的类实例)。 返回:
在此 collection 的元素上进行迭代的 Iterator
List l = new ArrayList();//这样写难道是实例化了List接口吗?当然不是你可以System.out.println(I);
看看他的实际类型。父类的所有子类都可以被称作是父类的类型。也就是说一个方法可以返回他声明类型的子类。在集合库中,HashMap,HashSet,ArrayList,Vector等等他们的iterator方法返回的都是Iterator的实现类,这样,我们就看不到他们,也不需要关心他们,也就保持了API的整洁。
ArrayList arrayList = new ArrayList();
如果你操纵实际类型,那么客户程序员就只能使用ArrayList中的实现
List list = new ArrayList();
如果你操纵接口,那么你就不需要关心list的实际类型,只要知道,他实现了List规定的所有接口就行了。比如你写了一个库提供一个方法
public List getList(){
return new ArrayList();
}
客户程序员使用的时候,他并不需要关心实际类型。突然有一天,你发现ArrayList并不能满足要求了,想把实现改为Vector,你可以改成
public List getList(){
return new Vector();
}
但是客户程序员所看到的API并没变,仍然是一个List类型。所以客户程序员不需要修改自己的程序。
List又继承自Collection所以可以说ArrayList可以是一个Collection.
对外的承诺是,只要你实现了Collection接口,我就可以为你服务。