List list=new ArrayList 写法的意义是什么

2022-01-20 11:24:11 +08:00
 HuPu
List list=new ArrayList 相比于 ArrayList list=new ArrayList 写法的意义是什么
8950 次点击
所在节点    Java
94 条回复
winterbells
2022-01-20 13:27:29 +08:00
kotlin 的 Arraylist 和 Java 的 Arraylist 是同一个东西,但包不同。导入了 java.util.* 就是 Java 的,没有就是 kotlin.collections 的。
上次看到这个报错惊了..
Rocketer
2022-01-20 13:35:04 +08:00
可能你还没遇到合适的场景。

一般来讲,定义属性和方法的参数类型时都会尽量选择较高层的类 /接口,以方便调用方。

但如果只是个局部变量,比如创建一个 list 然后作为参数传给上面提到的那种属性或方法,那怎么定义都行。
SirCarol
2022-01-20 13:44:54 +08:00
wolfie
2022-01-20 13:50:04 +08:00
多态
nekoneko
2022-01-20 13:55:23 +08:00
定义时的区别就是一个只能用接口提供的方法,一个可以用独有的方法,看情况使用即可没什么特殊的规定.

主要是用于限定方法参数 public void a(List list) public void b(Arraylist list)
Jwyt
2022-01-20 13:59:11 +08:00
@Leviathann LinkedList 确实好像没用到过,LinkedHashMap 用的比较多
passerbytiny
2022-01-20 14:05:14 +08:00
List list=new ArrayList ,声明一个 List 类型变量,用它的实现类 ArrayList 的构造器实例一个对象作为变量的值。
ArrayList list=new ArrayList ,你需要的是一个 ArrayList 类型的变量,并直接用它的构造器实例一个对象作为变量的值。

上面的语句一和语句二是两种语句,面向的是两种场景,并不是一种语句的二选一的两种写法。之所以语句一常见而语句二基本见不到的原因是:绝大多数情况下你需要的是一个“列表”,而不是要一个“基于数组实现的列表”。

ArrayList 的人生定义就是“List 的默认实现类”,所以通常情况下不会有声明 ArrayList 类型变量的需求。换成 LinkedList 就不一样了,当你明确的需要一个链表+顺序表时,就必须这样定义:LinkedList linkedList = new LinkedList
passerbytiny
2022-01-20 14:09:13 +08:00
纠正上面的错误,链表本身就是顺序的,不应该描述成链表+顺序表。当你明确的需要一个“经常插队方式插入删除数据”的列表时,就必须用“LinkedList linkedList = new LinkedList”语句。不过好像这样的场景也不多。
Jooooooooo
2022-01-20 14:23:43 +08:00
确实意义不大, 你第二种写法几乎都不会有问题.
wangxiaoaer
2022-01-20 14:29:11 +08:00
@HuPu #24 你创建的这个 list 可能作为参数传递给其他函数,其他函数接收的是 list 而不是 arraylist 。这个接收函数现在不一定有,以后可能会有,也或者一辈子都不会有。哈哈哈
HuPu
2022-01-20 14:36:24 +08:00
@wangxiaoaer 方法的参数类型是 list ,一样可以传 arraylist 啊
lianglu
2022-01-20 14:40:15 +08:00
这个问题其实跟开发 Spring 项目的时候要不要写接口一样,绝大部分的业务只有一个 Service 实现类,但是为了规范,为了扩展,最好还是写接口;同理 List 也一样
menglddd
2022-01-20 14:41:36 +08:00
面向接口编程,引用传递的过程中,可以作为更通用的接口在传递,还可以动态修改具体实现。如果要使用实现类的其他操作,就不需要用这种写法。
wangxiaoaer
2022-01-20 14:45:57 +08:00
@HuPu 草率了哈。
micean
2022-01-20 15:04:18 +08:00
没想到这问题也能讨论 50 多个回复? java 患者中毒颇多啊,各位在 java11 用不用 var 呢?
楼主你不要纠结这种问题
zxjunz
2022-01-20 15:04:58 +08:00
隐藏细节
Bromine0x23
2022-01-20 15:08:59 +08:00
@HuPu 是这个意思。有时候 IDE 一个补全就用上特有方法了。
ixx
2022-01-20 15:25:58 +08:00
道理你都懂 我就说点使用上的问题

如果你定义 ArrayList al = new ArrayList();

如果有一个方法你定义的参数是 test(ArrayList list);

调用的时候你写 test(al); 是可以的,如果要换成 LinkedList 要改的地方就多了

如果定义的是 List al = new ArrayList();

调用的时候 test(al);会报错提示你类型不对, 你只有改 test 参数定义为 test(List list);才行

改完你再想换 LinkedList 就容易了
SorcererXW
2022-01-20 15:44:22 +08:00
“Accept interfaces, return structs”
oneisall8955
2022-01-20 15:51:19 +08:00
接口入参定义为 List 有意义,方法内局部变量没意义

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/829411

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX