`

Think in java 持有对象

阅读更多
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的查询速度

 

 

 

 

 

 

 

 

 

 

chapter 9 interfaces  接口

 

      接口和内部类为我们提供了将接口和实现分开的方法(编程原则 :面向接口编程)我的理解是:你们公司做了一个项目,项目中你写了一个公共类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]);
	}
    }

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics