将值添加到Arraylist

San*_*p P 12 java

代码1:

ArrayList arr = new ArrayList();
arr.add(3);
arr.add("ss");
Run Code Online (Sandbox Code Playgroud)

代码2:

ArrayList<Object> arr = new ArrayList<Object>();
arr.add(3);
arr.add("ss");
Run Code Online (Sandbox Code Playgroud)

代码3:

ArrayList<Object> arr = new ArrayList<Object>();
arr.add(new Integer(3));
arr.add(new String("ss"));
Run Code Online (Sandbox Code Playgroud)

所有上述三个代码都工作正常..有人可以告诉我哪个是首选的,为什么...以及为什么eclipse编译器总是在没有提到Arraylist的参数类型时发出警告..提前感谢..

Joa*_*uer 10

第一个简单的规则:永远不要使用String(String)构造函数,它绝对没用(*).

所以arr.add("ss")很好.

3它略有不同:3是一个int文字,它不是一个对象.只有对象可以放入List.因此int需要将意志转换为Integer对象.在大多数情况下,将自动为您完成(该过程称为自动装箱).它有效地做同样的事情,Integer.valueOf(3)可以(和会)避免建立新的Integer在某些情况下的实例.

因此,实际写入arr.add(3)通常比使用一个更好的主意arr.add(new Integer(3)),因为它避免建立新的Integer对象,而是重用和现有的一个.

免责声明:我在这里专注于第二和第三代码块之间的区别,并且几乎忽略了泛型部分.有关泛型的更多信息,请查看其他答案.

(*)有一些模糊的角落情况,它有用的,但一旦你接近那些你会知道永远不会把绝对的陈述作为绝对;-)


Thi*_*ilo 6

第二个是首选:

  • 它避免了不必要的/低效的构造函数调用
  • 它使您指定列表的元素类型(如果缺少,则会收到警告)

然而,在同一列表中具有两种不同类型的对象具有一些不良的设计气味.我们需要更多的背景来谈论这个问题.

  • 为了详细说明@ Thilo的最后一点,许多Java开发人员会说将多个类型混合到`List <Object>`是问题,你应该更仔细地设计你的代码以保持类型安全. (2认同)