持有对象

1、Collection的构造器可以接受另一个Collection,用它来进行自身的初始化。但是,Collection.addAll()方法运行起来要快得多,而且构建一个不包含元素的Collection,然后调用Collection.addAll()这种方式很方便,因此这种方式是首选。
2、Arrays.asList()方法的限制是它对产生的List类型做出了最理想的假设,有时这种假设会引发问题。

class Snow{}
 class Powder extends Snow{}
 class Light extends Powder{}
 class Heavy extends Powder{}
 
 public class AsListInference{
// 		List<Snow> snow2 = Arrays.asList(new Light(), new Heavy());
//		Compiler sys:
//		found :java.util.List<Powder>
//		required: java.util.List<Snow>
 }

解决方法是:

List<Snow> snowList = new ArrayList<Snow>();
Collections.addAll(snowList, new Light(), new Heavy());

因为,Collections.addAll()从第一个参数中了解到了目标类型是什么。
或者,

List<Snow> snowList = Arrays.<Snow>asList(new Light(),new Heavy());

3、遍历容器时,为了避免为每种容器写遍历代码,我们可以使用Iterator。Iterator只能单向移动。Interator被称为轻量级对象,创建它的代价小。这样遍历容器的代码,可以作用于Iterator上,而不需要作用于具体某类容器,从而达到统一访问容器方式的目的。
4、ListIterator是一个更加强大的Iterator子类型,但它只能作用于各种List类的访问。ListIterator支持双向移动,可以产生相对于迭代器在列表中指向位置的前一个和后一个元素的索引,并且可以用set()方法替换它所访问过的最后一个元素。通过调用listIterator(n)方法产生一个指向列表索引为n的元素处的ListIterator。(n不传,指向开始处)。
5、 LinkedList提供了方法以支持队列的行为,并且它实现了Queue接口,因此LinkedList可以用作Queue的一种实现。通过将LinkedList向上转型为Queue。Queue接口窄化了对LinkedList的方法的访问权限,以使得只有恰当的方法才可以使用。
6、先进先出描述了最典型的队列规则。优先队列(PriorityQueue)声明下一个弹出元素是优先级最高的元素,与它们何时到达无关。PriorityQueue与基础类型合作时,默认为升序(即数字越小,优先级越高。如果是String,空格也可以算作值,并且优先级比其他字母高)。要定义自己的优先级规则,可以通过向PriorityQueue的构造函数中,传递自己实现的Comparator对象。
7、 Collection是描述所有序列容器共性的根接口。java.util.AbstractCollection类提供了Collection的默认实现,使得你可以创建AbstractCollection子类,而其中没有不必要的代码重复。
8、当你要实现一个不是Collection的外部类时,由于让它去实现Collection接口可能非常困难或麻烦,因此使用Iterator就会变得非常有吸引力(比如你的类已经继承其他类,导致你无法直接继承AbstractCollection来实现Collection时)。
9、foreach语法可以应用于任何Collection对象。只要实现了Iterable接口的对象,都能使用foreach。(Iterable接口包含一个能够生成Iterator的Iterator()方法)。而对于Iterable对象,当使用foreach时,我们希望有自定义的访问顺序,但是又希望保留原有的顺序时,这时不能采用覆盖iterator的方法。这时可使用适配器方法,添加一个能够产生Iterable对象的新方法。for(T t : NewClass.newIteratorMethod()).其中,newIteratorMethod()是我们自定义的能够生成iterator的方法。
10、 新程序中不应该使用过时的Vector,Hashtable和Stack。

posted @ 2017-06-17 12:15  kejicjk  阅读(157)  评论(0)    收藏  举报