为什么要用 List 而不是 ArrayList 有什么特别的用意吗?

解决方案 »

  1.   

    List是接口
    ArrayList是实现。接口有什么好处,这种定义方式就有什么好处
    当然你可以用
    ArrayList list = new ArrayList()
    但是一般不这么用
      

  2.   

    设计模式中有对依赖倒置原则。程序要尽量依赖于抽象,不依赖于具体。
    从Java语法上,这种方式是使用接口引用指向具体实现。
      

  3.   

    这是上传,通过LIST这个接口,特定情况下可以实现一般化
      

  4.   

    路过.......
    //----------------送个笑话-------------------儿子问爸爸,欲火焚身是什么意思,爸爸便委婉地告诉他是某人想要什么东西的意思。  语文课上没有粉笔,年轻的女老师刚好自己要去取时,儿子就立刻站起来说;“老师,我知道你是欲火焚身,还是让我满足你吧~” www.xiaohua007.com
      

  5.   

    比如,你若希望用LinkedList的实现来替代ArrayList的话,只需改动一行即可:
    List list = new LinkedList();
    而程序中的其它部分不需要改动,这样比较灵活
      

  6.   

    一种接口编程的思想
    比如说动物(Animal)是一个接口,猫,狗是动物中的一种(实现这个接口)
    Animal animal = new Cat() 或者 Animal animal = new Dog()
    当你产生了一个猫或狗的实例后,返回的是个动物
    List和ArrayList就象这样的
      

  7.   

    这个如果你想把存储结构该为LinkedList的时候,只要把List list = new ArrayList()该为list = new LinkedList()而其他的所有的都不需要改动。
      

  8.   

    f_acme(沧海一声笑) ( ) 信誉:100    Blog  2006-8-27 9:14:00  得分: 0  
    这个如果你想把存储结构该为LinkedList的时候,只要把List list = new ArrayList()该为list = new LinkedList()而其他的所有的都不需要改动。不赞成这种观点,当然这种观点的人很多。
    我觉得用接口代替实际类的好处在与声明一个方法参数以及返回值时,而不是具体使用时。
    因此,在模式书上说的Factory,Bridge,decorate,strategy,上有很多应用,(其实不用的话,就没法实现了)我想没有多少人真的去这样用Map map = new HashMap();犯不着吧。
      

  9.   

    这是JAVA多态的概念,你要是不清楚建议你先弄明白继承父类和实现借口,然后多态自然就明白了。
      

  10.   

    List是接口,
    ArrayList是实现。当然还有其他的实现。
    引用向下兼容,我想就是对返回值的兼容吧!
    java自身中就有很多这样的应用!
      

  11.   

    nako_ruru(娜可露露) 
    说话要自重吧,你这样只能是看出你的素质问题了(底BS)!
      

  12.   

    nako_ruru(娜可露露) ( ) 信誉:56    Blog  2006-8-28 21:59:36  得分:  
    可以简单的告诉你们,任何系统都应该针对抽象编程,而不是实际编程。不可理喻,反正我对面向对象没有什么研究,但你这话确实错的
    比如
    ArrayList list = new ArrayList()
    将ArrayList 改为了List,并且返回了这个List
    那么以后用的烦恼就是
    if(list instanceOf java.util.ArrayList){
    //do;....}
    else if(list instanceOf java.util.LinkedList)
    {
    //error
    }
    else if(list instanceOf cn.com.bigc.myList)
    {
    //do;some op not defined in List}
    ////等等。
    如果你要想把这个if else去掉,那么呵呵,你还必须再写几个类。这样的代价是不值得的。
    看过XP吧,简单适应法则。
    如果你事先已经确定了你肯定采用ArrayList,为什么要用List代替呢?如果用List代替,那么肯定是我所有的操作基本上都是它父类已经定义好的,否则这种替代,个人以为不一定合算。所有大师们的话的是具体的针对性问题。而不是一揽子方案。
      

  13.   

    我晕,你这样做的目的是什么?不就是为了针对抽象编程吗?针对抽象编程又不是说必须要用抽象类,而是满足条件的最顶层的类。如果以后要用到ArrayList的特殊方法,当然就会针对ArrayList编程。搂住提到了为什么要用List,那么前提就是List已经满足了他所要用的方法,所以应该抽象为List;再具体点,如果Collection就满足了条件,我们应该用Collection;更甚者,可能还会抽象为Object。想一想Object是具体类,但是它相对于它的子类确是抽象的。比如java.lang.Object o = new java.lang.StringBuffer("aaa");
        table.setValueAt(o, 0, 0);o不是抽象类,但是在o满足条件下应该针对o编程,否则在修改时将会导致该动量较大。另外java.lang.StringBuffer buffer = new java.lang.StringBuffer("aaa")
        table.setValueAt(buffer.toString(), 0, 0);
        buffer.setLength(0);当然StringBuffer的包和一些方法我记不住,但是却表达了为什么要抽象,应该如何抽象的意义。
      

  14.   

    nako_ruru(娜可露露) ( ) 信誉:56    Blog  2006-8-30 12:44:37  得分: 0  
    其实,本来我不想说什么,只是看到你的言论如此贬低程序员,让人恼火。但是我相信,如果你写的代码不少的话 ,instance of,是不是经常出现,还有那个if else?
    要不就是,或者本来只需要1,2个类就搞定的事情,你是不是加上一大堆抽象类,接口,缺省实现类?!大量的if else 或者过度设计带来的众多烦恼都应该是考虑的。最后一贴,不说了。
      

  15.   

    我认为程晨举的例子已经very ns了,应该得分了
      

  16.   

    至于上面提到选择 ArrayList和LinkedList就好比下面这种情况首先我要使用电视机,但是在康佳和TCL我要做一种选择,但是目的是为了让电视机使用者不关心康佳和TCL到底怎么做的电视机。
      

  17.   

    我觉得这个东西主要是个人习惯,我一般用的是List list = new ArrayList();
    从我的项目经验来说,很少有把ArrayList改成Vector或者其他List实现的情况,不过也并没有因为使用List而使用instanceof,之所以用List,是因为觉得“针对接口编程”是个好的编码和设计实践,也是我的编码习惯。
    尽管使用List虽然没有很明显的体现出“针对接口编程”的好处,不过这种编码实践也没有给我带来instanceof的烦恼,所以我还是建议用List,毕竟这种方式符合“针对接口编程”这种编码实践,而且养成“针对接口编程”也是很重要的。
      

  18.   

    其实这不就是面向对象语言的一个特性--多型性 吗??
    private List abc = new ArrayList(); 这一句说的就是List是ArrarList的基础类,所以用基础类的类型来定义完全可以
    这句表达就是直接具有了基础类的特征。