一、持有对象
Java提供了多种容器来解决持有对象问题,包括List、Set、Queue、Map。
Set对于每个值都保存一个对象
Map是允许你将某些对象与其他一些对象关联起来的关联数组。
PS:在编程时,你可以将任意数量的的对象放置到容器中,并且不需要担心容器应该设置为多大。
@SuppressWarnings注解可以用来一直警告信息。
@SuppressWarnings("unchecked")表示只有有关“不受检查的异常”的警告信息应该被抑制。
使用泛型来限定容器内的对象类型
向上转型也可以像作用于其他类型一样作用于泛型。
Arrays和Collections类中都有很多实用方法,可以在一个Collection中添加一组元素。
Arrays.asList()方法接受一个数组或者是一个逗号分隔的元素列表(使用可变参数),并将其转换为一个List对象。该List底层标识的数组,因此不能去调整尺寸。如果试图用add()或delete()方法在这种列表中添加或者删除元素,就有可能会引发去改变数组尺寸的尝试。
Collections.addAll()方法接受一个Collection对象,以及一个数组或则一个用逗号分隔的列表,将元素添加到Collection中。
迭代器
ListIterator 是一个更加强大的Iterator子类型,它只能用于各种List类的访问。
Iterator只能向前移动,但是ListIterator可以双向移动。
可以产生当前指向位置的前一个和后一个元素的索引。
可以使用set()方法替换它访问过的最后一个元素。
通过调用listIterator方法产生ListIterator。
通过调用listIterator(n)创建一个一开始就指向列表索引为n的元素处的ListInterator。
public class ListIteration{ public static void main(String[] args){ List<Pet> pets = Pets.arrayList(8); ListIterator<Pet> it = pets.listIterator(); while(){ System.out.print(it.next()+","+it.nextIndex() + ","+ it.previousIndex() + "; "); } System.out.println(); while(it.hasPrevious() + ""){ System.out.println(it.previous().id() + " "); }
System.out.println(pets); it = pets.listIterator(3); while(it.hasNext()){
it.next(); it.set(Pets.randomPet());
} System.out.println(pets);
}}
Map 是一种将对象而非数字,与对象关联的设计。
HashMap设计用来快速访问;
TreeMap保持“键”始终处于排序状态,所以没有HashMap快;
LinkedHashMap保持元素插入的顺序,但是也通过散列提供了快速访问能力;
public class Apple{ private static long counter; private final long id = counter++; public long id(){ return id; } }
public class Orange{}
public class ApplesAndOrangesWithGenerics{ public static void main(String[] args){ ArrayList<Apple> apples = new ArrayList<Apple>(); for(int i=0;i<3;i++){ apples.add(new Apple()); //编译出错 //apples.add(new Orange()); } for(int i=0;i<apples.size();i++){ System.out.println(apples.get(i).id()); } //使用foreanch for(Apple a:apples){ System.out.println(a.id()); } } }
二、异常
异常的产生
同其他对象的创建一样,Java使用new在堆上创建异常对象。
在使用new创建了异常对象之后,此对象的引用将传给throw;
异常处理紧跟在try块之后。当异常被抛出时,异常处理机制将负责搜寻参数与异常类型相匹配的第一个处理程序。然后进入catch子句执行,一旦catch子句结束,则处理程序的查找过程结束。