ArrayList aList = new ArrayList();
List aList = new ArrayList();
这两者有什么区别,使用哪个更好,为什么?
ArrayList aList = new ArrayList();
List aList = new ArrayList();
这两者有什么区别,使用哪个更好,为什么?
自Java 1.5以来,这两个功能都已被弃用。
正确的写法应该是:
List<String> list = new ArrayList<String>();
// or whatever data type you are using in your list
List<String> list = Lists.newArraylist();
List<T>
是一个接口,而ArrayList<T>
是一个类,这个类实现了List<T>
接口。ArrayList<T>
特定的方法,你可以将其类型声明为接口List<T>
类型。使用第二种形式,更容易将实现从ArrayList<T>
更改为其他实现了List<T>
接口的类。List<T>
或ArrrayList<T>
的方法的参数。但是当我声明方法时,我更喜欢使用接口。 void showAll(List <String> sl) ...
并使用:
void showAllAS(ArrayList <String> sl) ...
只有在我的方法使用特定于ArrayList<T>
的方法时,例如ensureCapacity()
。
建议我们使用带类型参数List<T>
而不是简单的List
是非常好的(当然,如果我们不使用古老的Java)。
ArrayList aList
可以作为参数传递给任何需要List
或ArrayList
参数的方法。第二种形式List aList
只能作为参数传递给需要List
参数的方法。虽然变量List aList
引用了一个ArrayList
,但强类型会防止引用变量aList
匹配为ArrayList
参数的参数。 - Bert FArrayList
传递给需要List
的方法。但是,您无法将List
传递给要求ArrayList
的方法。 - IshtarType x = new Constructor();
明确是实现细节的一部分。它不是公共API的一部分(除非它是public final
,但List
是可变的,所以这是不合适的)。List
,好像这并不重要,你也不在乎?List
的理由是"我太懒了,不想打字"。这也涵盖了这样一个论点:"如果我需要移动到另一个列表实现上,我就少修改了一个地方"。ConcreteFoo foo = new ConcreteFoo();
到 OtherConcreteFoo foo = new OtherConcreteFoo();
。ArrayList<T>
的ensureCapacity
FakeFileSystem#createFakeFile
。IOException
,因此使用StringReader
代替Reader
作为局部变量意味着您不需要处理实际上无法发生的异常,并且显著减少了样板文件。List<String> x = new ArrayList<String>();
它为您提供一点类型安全性。列表 'x' 只能添加一个字符串对象。当你从列表 'x' 获取一个项目时,可以保证返回的是一个字符串。这也有助于消除不必要的强制转换,当你在6个月后回过头来尝试记住你的代码时,它可以使代码难以阅读。您的编译器/IDE 将帮助您通过显示错误来记住应该添加到列表 'x' 中的类型,如果您尝试添加其他任何对象类型,则会显示错误。
如果要向列表中添加多个对象类型,则可以添加注释以抑制编译错误。
@SuppressWarnings("unchecked")
List y = new ArrayList();
List<Object>
。例如:List<Object> y = new ArrayList<Object>(); y.add(1); y.add("abc"); y.add(true);
- Sean Patrick Floyd我知道至少有一种情况下,使用接口声明变量是行不通的。那就是当你想要使用反射时。
我曾经修复过一些代码中的一个错误,其中我将一个变量声明为Map<String, MyObject>
并将其分配给HashMap<String, MyObject>
的实例。这个变量被用作一个方法调用的参数,该方法通过反射访问。问题在于,反射试图找到一个具有HashMap
签名而不是声明的Map
签名的方法。由于没有带有HashMap
参数的方法,我无法通过反射找到方法。
Map<String, Object> map = new HashMap<String, Object>();
public void test(Map<String, Object> m) {...};
Method m = this.getClass().getMethod("test", new Class<?>[]{map.getClass()});
将无法找到使用接口的方法。如果您创建另一个使用HashMap
的测试版本,则它将起作用 - 但现在您被迫使用具体类声明变量,而不是更灵活的接口...