1.解释一个数组arr在必要的时候如何被拓展(其初始长度为10)
int [] arr=new int[10];
....
//下面我们决定需要扩大arr
int [] newArray=new int[arr.lenth*2];
for(int i=0;i<arr.length;i++){
newArray[i]=arr[i];
}
arr=newArray;
2.Iterator接口
Iterator接口的思路是,通过iterator方法,每个集合均可创建并返回给客户一个实现Iterator接口的对象,并将当前位置的概念在对象内部存储下来。
每次对next的调用都给出集合的(尚未见到)下一项。因此,第1次调用next给出第1项,第2次调用给出第2项,等等。
hasNext用来告诉是否存在下一项。当编译器见到一个正在用于Iterator的对象的增强的for循环的时候,它用于iterator方法的那些调用代替增强的for循环以得到一个Iterator对象,然后调用next和hasNext。因此,前面看到print例程由编译器重写,见图3-8所示。
public static <AnyType> void print(Collection<Antypr> coll){
Iterator<AnyType> itr=coll.iterator();
while(itr.hasNext()){
AnyType item=itr.next();
System.Out.println(item);
}
}
由于Iterator接口中的现有方法有限,因此,很难使用Iterator做简单遍历 Collection以外的任何工作。Iterator接口还包含一个方法,叫做remove。该方法可以删除有next最新返回的项(此后,我们不能调用remove,知道对next再一次调用以后)。虽然Collection接口也包含一个remove方法,但是,使用Iterator的remove方法可能有更多的优点。
Iterator的remove方法的主要优点在于,Collection的remove方法必须首先找出要被删除的项。如果知道所要删除的的项的准确位置,那么删除它的开销很可能要小得多。
当直接使用Iterator(而不是通过一个增强的for循环间接使用)时,重要的是要记住一个基本法则:**如果对正在被迭代的集合进行结构上的改变(即对该集合使用add、remove、或者clear方法),那么迭代器就不再合法(并且在其后使用该迭代器时将会有ConcurrentModificationException异常被抛出)。**