import java.util.*;classApple{privatestaticlong counter;privatefinallong id = counter++;publiclongid(){return id;}}classOrange{}publicclassApplesAndOrangesWithoutGenerics{@SuppressWarnings("unchecked")//不受检查的异常的警告信息应该被抑制publicstaticvoidmain(String[] args){
ArrayList apples =newArrayList();for(int i =0;i <3;i++)
apples.add(newApple());
apples.add(newOrange());for(int i =0;i < apples.size();i++)
System.out.println(((Apple)apples.get(i)).id());}}/*
0
1
2
异常
用上泛型避免添加不同类对象的问题
ArrayList<Apple> apples =newArrayList<Apple>();//此时从容器中取出对象也不用强制类型转换了,因为通过泛型,编译器知道里面对象的类型
向上转型也可以用于泛型容器
classGalaextendsApple{}classFujiextendsApple{}public Class A{publicstaticvoidmain(String[] args){
ArrayList<Apple> apples =newArrayList<Apple>();
apples.add(newGala());
apples.add(newFuji());}}
List<Pet> pets = Pets.arrayList(12);
Iterator<Pet> it = pets.iterator();while(it.hasNext())
Pets p = it.next();
it = pets.iterator();for(int i =0;i <6;i++){
it.next();
it.remove();}
Iterator 可以用于各种类型的容器遍历
publicstaticvoiddisplay(Iterator<Pet> iterator){while(iterator.hasNext())
Pet p = iterator.Next();}
ArrayList<Pet> pets = Pets.arrayList(8);
LinkedList<Pet> petsLL =newLinkedList<Pet>(pets);
HashSet<Pet> petsHS =newHashSet<Pet>(pets);
TreeSet<Pet> petsTS =newTreeSet<Pet>(pets);display(pets.iterator());display(petsLL.iterator());display(petsHS.iterator());display(petsTS.iterator());
ListIterator 是 Iterator 的子类型,只能用于 List 的遍历, 能够双向移动
ListIterator<Pet> it = pets.listIterator();//生成 ListIterator
ListIterator<Pet> it = pets.listIterator(3);//指向 3 位置的 ListIterator
it.hasNext()
it.next()
it.nextIndex();
it.previous();
it.hasPrevious();
it.previousIndex();
it.set(Pets.randomPet());//用新的元素替换当前迭代器中元素
publicclassInterfaceVsIterator{publicstaticvoiddisplay(Iterator<Pet> it){while(it.hasNext())
Pet pet = it.next();}publicstaticvoiddisplay(Collection<Pet> pets){for(Pet pet : pets)print(p.id());}}//用两种方式都可以将容器的遍历与底层容器的特定实现解藕
import java.util.*;classReversibleArrayList<T>extendsArrayList<T>{publicReversibleArrayList(Collection<T> c){super(c);}public Iterable<T>reversed(){returnnewIterable<T>(){public Iterable<T>iterator(){returnnewIterable<T>(){int current =size()-1;publicbooleanhasNext(){return current >-1;}public T next(){returnget(current--);}publicvoidremove(){}};}};}}publicclassAdapterMethodIdiom{publicstaticvoidmain(String[] args){
ReversibleArrayList<String> ral =newReversibleArrayList<String>(
Arrays.asList("To be or not to be".split(" ")));for(String s : ral)
System.out.print(s +" ");
System.out.println();for(String s : ral.reversed())
System.out.print(s +" ");
System.out.println();}}//适配器设计模式
List<Integer> list =newArrayList(Arrays.asList(ia);
Collections.shuffle(list, rand);//此时list被打乱,ia不会被打乱
Collections.shuffle(Arrays.asList(ia),rand);//此时ia作为List的底层数组会被打乱
11.1 泛型和类型安全的容器import java.util.*;class Apple { private static long counter; private final long id = counter++; public long id() { return id; }}class Orange {}public class ApplesAndOrangesWithoutGenerics { @SuppressWarnings("unchecked") //不受检查的异常