在java中使用接口或类型进行变量定义?

Joh*_*ohn 14 java

ArrayList aList = new ArrayList();

List aList = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

这两者之间有什么区别,哪个更好用,为什么?

Ric*_*ich 21

List是一个接口,而ArrayList是该接口的一个实现.

第二个更好,因为这意味着您可以稍后更改ArrayList以用于List的另一个实现,而无需更改应用程序的其余部分.出于性能原因,或者由于您已选择/将要选择的List实现的行为的其他方面,您可能希望这样做.

  • @Bill每个人总是在你可能切换的实现中提到LinkedList,但是如果你提到Collections.unmodifiableList(),Collections.checkedList()或Collections.synchronizedList(),我认为这个案例会变得更强. (5认同)

Sea*_*oyd 7

自Java 1.5以来,两者都被弃用.

它应该是:

List<String> list = new ArrayList<String>();
// or whatever data type you are using in your list
Run Code Online (Sandbox Code Playgroud)

请阅读Joshua Bloch的Effective Java,特别是这两个项目:

  • 23:不要在新代码中使用原始类型(甚至可以在线获取)
  • 52:通过接口引用对象

顺便说一下,如果你使用Guava,你有一个工厂方法来构造一个ArrayList,所以你不必重复type参数:

List<String> list = Lists.newArraylist();
Run Code Online (Sandbox Code Playgroud)


Mic*_*las 5

List<T>是接口,其中ArrayList<T>是类,这个类实现List<T>接口.

我更喜欢第二种形式,它更通用,即如果你不使用特定的方法,ArrayList<T>你可以将它的类型声明为接口List<T>类型.使用第二种形式,将实现更改ArrayList<T>为实现List<T>接口的其他类将更容易.

编辑: 由于许多SO用户评论两种形式可以是任何接受List<T>或方法的参数ArrrayList<T>.但是,当我声明方法时,我更喜欢接口:

 void showAll(List <String> sl) ...
Run Code Online (Sandbox Code Playgroud)

并使用:

 void showAllAS(ArrayList <String> sl) ...
Run Code Online (Sandbox Code Playgroud)

只有当我的方法使用特定的方法时ArrayList<T>,比如ensureCapacity().

对我们应该使用的信息的响应List<T>而不仅仅是List非常好(当然如果我们不使用古代Java).

  • @Ishtar,Bert,确切地说.但是你忘了提到一个方法几乎不会期望一个ArrayList.在99%的情况下,任何列表和50%的任何集合都可以. (3认同)
  • -1这恰恰相反; 你可以将`ArrayList`传递给想要`List`的方法.你不能将`List`传递给一个要求`ArrayList`的方法. (2认同)