最近看Java的集合框架,但有几点令我很疑惑。如:Collection<String> col = new ArrayList<String>();
List<String> list = new ArrayList<String>();
ArrayList<String> arrList = new ArrayList<String>();
我不明白为什么要用前面两种定义的方法,见笑了!

解决方案 »

  1.   

    如果我以后改用CopyOnWriteArrayList了呢?
    List<String> list = new ArrayList<String>();这种写法表示后面只能用List接口里的方法,而不能使用ArrayList中的方法,一旦我需要改变实现,我只需改这一句就可以了List<String> list = new CopyOnWriteA。。
      

  2.   

    java中强调面向接口编程,我们都知道父类对象引用可以指向子类对象。Collection<String> col = new ArrayList<String>();
    这样写可以改变Collection的实现类。
      

  3.   

    List和Connection接口的实现类就是ArrayList啊!!这就是面向接口的一个优点啊!!!你第三个说不好听的是面向对象啊!!!
      

  4.   

    看你想要定义的是什么,如果你就想定义一个非同步……具体参考API的列表,而且保证以后需求不会变化,那么使用第三种是没有问题的。
    如果不能保证,那就需要看你想要什么如果要一个列表,就用第二种。
      

  5.   

    前面两种是向上转型,你可以运用前面接口定义的方法,而对于最后一种你就只能用arrylist定义的方法了,向上转型有利于多态的实现。你可以去看看多态!
      

  6.   

    A和B两个类。
    A调用了B的create方法来创建集合对象。
    其实,对于A来讲,没有必要关心B将建的结合对象,到底是ArrayList还是LinkedList或者是其他的什么集合。
    这样,create方法的返回值就可以直接写成Collection了。有什么好处?
    有一天,某人写了一个C类。
    C调用了A的某些方法,针对B所创建的集合进行插入删除操作。并且这些操作非常密集。
    严重影响了程序的效率。这时,你发现,原来B创建的集合对象是ArrayList。
    如果面向接口编程,我们只需要更改B的create方法中,new ArrayList替换成new LinkedList,其他不变即可。
    如果没有面向接口编程,我们要该A和B的相关方法。如果C也被牵扯进来,那还要该C的代码。当然了,这只是一个例子而已,未必现实真是这样。并且,面向接口编程,并不只是这一点好处。其他的优点,网上可以查到很多。呵呵。
      

  7.   

    其实,在具体的编程当中,如果不存在,我所说的A。B。C这种类似关系时,
    完全没必要纠结什么接口不接口的。关键看具体环境咯。
      

  8.   

    谢谢楼上各位,原来是面向接口编程啊...学了一个月,还真没听说过,只听过面向对象! > <