黑马程序员技术交流社区

标题: 集合的问题 [打印本页]

作者: 于潇    时间: 2012-5-7 08:41
标题: 集合的问题
List<T> list=new ArrayList<T>;
与ArrayList<T> list=new ArrayList<T>;
这两种定义的方法区别在哪里?一般用哪一种比较好呢?
作者: 赵玮_Tom    时间: 2012-5-7 09:13
本帖最后由 赵玮_Tom 于 2012-5-7 09:14 编辑

其实这两中方式没必要刻意去区分。如果非要区分的话,各自都有适用的场合。如果写程序时,只涉及到了ArrayList一种集合,不涉及多态转型问题,可以直接ArrayList<T> list = new ArrayList<T>();
但还有另一种情况:比如有个之前定义的函数可以对List集合下的所有集合进行操作,为了提高扩展性,函数要求传入的参数类型肯定是List,那么可以用List引用接收List集合的所有实例对象(ArrayList, LinkedList, Vector),使用List<T> list = new ArrayList<T>()这种形式会比较好,增强阅读性,将向上转型体现的很明显,当然,使用ArrayList<T> list = new ArrayList<T>()也是完全可以的。
所以二者的区别就在于是否体现向上转型。
作者: 张成龙    时间: 2012-5-7 09:59
List<T> list=new ArrayList<T>;更好一些,这样可以提高程序的扩展性,这就是面向父类或接口编程的优点
作者: 隋营营    时间: 2012-5-7 10:13
最重要的区别就是:
List<T> list = new ArrayList<T> 方式更灵活,扩展性好:应用多态的机制,而多态正是JAVA核心的核心!

比如说,你想使用LinkedList代替ArrayList,只需要更改ArrayList即可。更好的方式是把要实例化的对象(ArrayList、LinkedList……)写在配置文件中,创建对象时从配置文件中读出,那就更完美了,代码都不用改动,直接修改配置文件就可以更换List的实现方式!
作者: 周四川    时间: 2012-5-7 10:43
一般都使用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()
因为List有多个实现类,如 LinkedList或者Vector等等,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类呢?,这时你只要改变这一行就行了:List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。假设你开始用 ArrayList alist = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。  ,如果没有特别需求的话,最好使用List list = new LinkedList(); ,便于程序代码的重构. 这就是面向接口编程的好处
作者: 廖理    时间: 2012-5-7 11:09
第一种List<T> list=new ArrayList<T>用通俗的说法第一种就是就是父类引用指向子类对象,
专业说法是向上转型,即子类对象转成父类对象,这样做的好处是,可以增强程序的扩展性。
如果以后升级要换另一种List容器,程序主体不用改变,只需将new ArrayList<T>改变即可,
例如:如果以后升级时要改成LinkedList是只需将List<T> list=new ArrayList<T>改变成List<T> list=new LinkedList<T>其他地方都不用改.
这就增强了程序的扩展性。
但是这样一来就不能调用ArrayList的特有方法。所以在应用时要结合具体需要来决定用哪种方式。
如果要就非常好的扩展性则用第一种方式List<T> list=new ArrayList<T>,
若要用到ArrayList的特有方法则用第二种ArrayList<T> list=new ArrayList<T>
作者: 龚正军    时间: 2012-5-7 14:34
本帖最后由 龚正军 于 2012-5-7 14:35 编辑

上面都解释得很清楚了,我在这更清晰点给你说明下,免得你搞迷糊了:
List<T> list=new ArrayList<T>;
ArrayList<T> list=new ArrayList<T>;
两者之间唯一区别就是上面是多态,下面没有多态。而多态的特性我想应该清楚,如果不清楚可以重看下多态的视频,问题不复杂!

我想说的是:List<T> list=new ArrayList<T>;  -------------------------------------------list这个变量就是指向的List这个容器!也就是List list;  别多想其他的,应此他带有所有List容器的好处,他可以用成ArrayList也可以用成LinkedList。这就是他的好处!只不过这儿我们要用到他其中的一个ArrayList好处而已。
                  ArrayList<T> list=new ArrayList<T>;--------------------------------------list这个变量就是指向的ArrayLIst这个容器!也就是ArrayList list; 他也只能是ArrayList容器类!(没了多态了而已)

作者: 于潇    时间: 2012-5-7 22:51
廖理 发表于 2012-5-7 11:09
第一种List list=new ArrayList用通俗的说法第一种就是就是父类引用指向子类对象,
专业说法是向上转型,即 ...

嗯,明白了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2