声明ArrayList或集合实现类的最佳实践

Nav*_*een 8 java collections arraylist

任何人都可以解释以下ArrayList存储声明的区别String.

List type1 = new ArrayList();
List type2 = new ArrayList<String>();
List<String> type3 = new ArrayList<String>();
ArrayList<String> type4 = new ArrayList<String>();
List<String> type5 = null;
ArrayList<String> type6 = null;
Run Code Online (Sandbox Code Playgroud)

那么上面哪个声明是声明ArrayListString的最佳做法,为什么?

JB *_*zet 7

前两个使用原始类型.这样做意味着您的列表根本不是类型安全的.编译器将允许您将整数存储在内部,即使您的目的是要有一个字符串列表.编译器将发出警告,您不应忽略.

第三个是对的.它告诉编译器您的意图是使用字符串List,并且您选择的特定实现是ArrayList.如果您稍后改变主意并希望使用LinkedList,则此行代码是您需要更改的唯一代码.

第四个告诉编译器你的程序不只需要一个List.它需要此List为ArrayList.如果您的代码确实需要调用特定于ArrayList的方法,并且在List接口中不存在,那么这是可以的.但在99.9%的情况下,情况并非如此,你应该更喜欢第三种情况.

最后两个声明了一个变量并将其初始化为null而不是创建一个列表.这是一种设计气味.在使用列表之前,您必须确保无处不在.立即使用有效列表初始化它会更安全.


Mar*_*oun 6

  • List type1 = new ArrayList();
  • List type2 = new ArrayList<String>();

    你有一个原始类型 ArrayListList,你不应该使用它们(虽然它是合法的代码):

    ...术语"未选中"表示编译器没有足够的类型信息来执行确保类型安全所必需的所有类型检查

  • List<String> type3 = new ArrayList<String>();

    这个是安全的,因为Java 7它可以使用菱形运算符并重写为:

    List<String> type3 = new ArrayList<>();

    它是最好的,因为它是一个接口程序,这意味着你可以改变type3到任何其他实现的类List.

  • ArrayList<String> type4 = new ArrayList<String>();

    这个是一个特定的对象,你永远不能把类型更改为type4别的而不是ArrayList.

最后两个不能与其余的相比,你只是给它们一个默认值,有时你被迫,有时你可以跳过这个初始化.