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()); // Compile-time error: // apples.add(new Orange()); for(int i = 0; i < apples.size(); i++) System.out.println(apples.get(i).id());//在get时候替你执行转型 // Using foreach: for(Apple c : apples) System.out.println(c.id()); } }
11.3 添加一组元素:
Collections下的addAll()方法接受一个Collection对象,以及一个数组或是一个逗号分割的列表,将元素添加到Collection对象中 例如:
Collection<Integer> collection = new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5)); Integer[] moreInts = { 6, 7, 8, 9, 10 }; collection.addAll(Arrays.asList(moreInts));// list对象
Collections.addAll(collection, 11, 12, 13, 14, 15)//逗号风格的列表
Collections.addAll(collection, moreInts);//数组
List<Integer> list = Arrays.asList(16, 17, 18, 19, 20);//asList方法返回的是List 但底层表示是数组 不能调整尺寸 list.set(1, 99); // OK -- modify an element // list.add(21); // Runtime error because 底层表示是数组 不能调整尺寸
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()); // List<Snow> snow2 = Arrays.asList( // new Light(), new Heavy());Arrays.asList中只有Powder类型的,因此它会创建List<Powder>而不是List<Snow> 所有本句编译通不过
HashSet 最快的获取元素的方式
TreeSet 比较结果的升序排列
LinkedHashSet 添加的顺序保存对象
HashMap 无序,最快的查找速度
TreeMap 键升序保存
LinkedHashMap 添加的顺序保存对键 并保留了HashMap的查询速度
接口和内部类为我们提供了将接口和实现分开的方法(编程原则 :面向接口编程)我的理解是:你们公司做了一个项目,项目中你写了一个公共类XxxServer 供的各个模块使用, 每次使用的时候都需要new XxxServer ();XxxServer 散落在各个模块的代码中。这个项目很成功准备全国推广,但使用你项目的客户需求有多种,其中XxxServer需要修改。你可能就想 改XxxServer就ok了啊。是的 可以。但这“多种需求”共有10多个 这样你的XxxServer需要改10多个版本,每次给客户部署的时候你就需要把 XxxServer替换成客户需要的而且不同版本的XxxServer名字必须一样 ,因为别的模块的代码都是这样new XxxServer()使用XxxServer的。
好的方法是:使用把XxxServer声明为接口 ,定义工厂方法 getXxxServer()来得到XxxServer的具体实现,通过配置文件来决定getXxxServer()得到的是哪个具体XxxServer的实现类 这样你只需要修改配置文件就使得项目的具体功能可“配置”了
上面举的例子可能还不是“面向接口编程”好处的最好体现。大家可以看看集合框架中的设计List ArrayList LinkedList 实现。
下面是Collections.sort(list)方法 ,比较能体现接口编程的好处 ,想想看如果方法参数是具体的实现ArrayList 是什么样的情况
public static <T extends Comparable<? super T>> void sort(List<T> list) { Object[] a = list.toArray(); Arrays.sort(a); ListIterator<T> i = list.listIterator(); for (int j=0; j<a.length; j++) { i.next(); i.set((T)a[j]); } }