(1)基本概念
/*
* P218
*/
import java.util.*;
class Apple{
private static long counter;
private final long id =counter++;
public long id(){return id;}
}
class GrannySmith extends Apple{}
class Gala extends Apple{}
class Fuji extends Apple{}
class Braeburn extends Apple{}
public class GenericsAndUpcasting {
public static void main(String[] args){
ArrayList<Apple> apples = new ArrayList<Apple>();
apples.add(new GrannySmith());
apples.add(new Gala());
apples.add(new Fuji());
apples.add(new Braeburn());
for(Apple c : apples)
System.out.println(c);
}
}
在ArrayList中,尖括号括起来的是类型参数()可以有多个,它指定了这个容器实例可以保存的类型。通过使用泛型,就可心在编译斯防止将错误类型的对象放置到容器中。
如果不需要使用每个元素的索引,可以使用foreach语法来选择List中的每个元素。
1)Collection。一个独立元素的序列,这些元素都服从一条或者多条规则。List必须按照插入的顺序保存元素,而Set不能有重复元素。Queue按照排除规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
2)Map。一组成对的"键值对"对象,允许你使用键来查找值。ArrayList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在一起。映射表允许我们使用另一个对象来查找某个对象,它也被称为“关联数组”,因为它将某些对象与另外一些对象关联在了一起,这也被称为“字典”。
/*
* P220-221
*/
import java.util.*;
class Snow{}
class Powder extends Snow{}
class Light extends Powder{}
class Heavy extends Powder{}
class Crusty extends Snow{}
class Slush extends Snow{}
public class AsListInference {
public static void main(String[] args){
List<Snow> snow1=Arrays.asList(new Crusty(),new Slush(),new Powder());
//Won't compile:
//List<Snow> snow2 =Arrays.asList( new Light(),new Heavy());
//Compiler says:
// fount :java.util.List<Powder>
// required:java.util.List<Snow>
// Collections.addAll() doesn't get confused:
List<Snow> snow3=new ArrayList<Snow>();
Collections.addAll(snow3, new Light(),new Heavy());
//Give a hint using an
//explicit type argument specification;
List<Snow> snow4=Arrays.<Snow>asList(new Light(),new Heavy());
}
}
Collection.addAll()方法运行起来要快得多,而且构建一个不包含元素的Collection,然后调用Collections.addAll()这种方式很方便,因此它是首选方式。
你也可以直接使用Array.asList()的输出,将其当作List,但是在这种情况下,其底层表示的是数组,因此不能调整尺寸。如果你试图用add()或delete()方法在这种列表中添加或删除元素,就有可能会引发去改变数组尺寸的尝试,这会导致Unsupported Operation错误。
List类型:ArrayList和LinkedList都是List类型。它们都按照被插入的顺序保存元素。
Set类型:HashSet,TreeSet和LinkedHashSet都是Set类型。每个相同的项只有保存一次。HashSet按一种复杂但最快获取元素的方式存储,TreeSet按比较结果升序保存对象,LinkedHashSet按照添加的顺序保存对象。
Map类型::按键值对来存储对象,其键和值都是对象并相关联。
(2)选代器
选代器模式:选代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。此外,选代器通常被称为轻量级对象:创建它的代价小。import java.util.*;
import typeinfo.*;
/*
* P226
*/
public class SimpleIteration {
public static void main(String [] args){
List<Pet> pets=Pets.arrayList(12);
Iterator<Pet> it=pets.iterator();
while(it.hasNext()){
Pet p=it.next();
System.out.print(p.id()+" :"+p+"");
}
System.out.println();
//A simpler approach,when possible;
for(Pet p:pets)
System.out.print(p.id() +" :"+p+" ");
System.out.println();
//an Iterator can also remove elements;
it=pets.iterator();
for(int i=0;i<6;i++){
it.next();
it.remove();
}
System.out.println(pets);
}
}
要注意的是,在此例中使用了foreach语句,该语句可以用于数组或其他任何Iterable,但是这并不意味着数组肯定也是一个Iterable,任何自动包装也不会发生。