是什么区别List <string> stringList = new ArrayList <string>()和List <string> stringList = new ArrayList()?</string> </string> </string>

时间:2014-04-05 02:52:41

标签: java arraylist

我知道java中可以进行以下声明和初始化。

List<String> stringList = new ArrayList<String>() 

List<String> stringList = new ArrayList()?

但它们之间究竟有什么区别?

另外,您更喜欢如何命名列表变量?你喜欢将它们命名为variableList或只是变量吗?或者你有其他方法吗?

4 个答案:

答案 0 :(得分:11)

虽然第二个会给你一个编译警告,但确实没什么区别。

它们编译为相同的字节码,因为编译器会丢弃有关您使用的类型参数的信息。

问题是ArrayList类是在泛型之前发明的,所以我们以前总是必须将其创建为new ArrayList(),而不指定类型参数。现在使用泛型,我们可以指定将ArrayList中存储的对象类型,并让编译器检查我们是否正确使用它。这样做的符号就是你在第一个例子中使用的。

但是编译器随后执行的任何检查都是基于变量的类型,而不是您创建的类的类,因此差异将完全没有影响,超过初始编译器警告。

从Java 7开始,编写它的首选方法是List<String> stringList = new ArrayList<>();,但这种表示法在早期版本的Java中不可用。

答案 1 :(得分:4)

这些名称都不好:变量的名称应反映其内容。我已经知道它是一个变量,我已经知道它是一个列表。

列表中有什么?例如:如果它是我刚刚在宠物商店购买的小狗包:

List<Puppy> puppies = new ArrayList<>() 

注意我是如何省略类型的:自Java 7以来这是可能的,与

完全相同
List<Puppy> puppies = new ArrayList<Puppy>() 

答案 2 :(得分:1)

”是的,为了达到与以前的Java版本的向后兼容性,允许这样做。 不,您不想这样编码。 请考虑以下内容:

List objList = new ArrayList();
objList.add(new Object());

List<String> list = objList;

编译器很乐意对此进行编译,但是猜猜您在List中得到了什么?一个东西! 通过声明一个Collection,您希望确保在那里仅获得Strings,而原始类型collections则允许您添加任何内容。重构后的一天,您的新ArrayList()将通过单独的方法返回。也许第二天有人会向其中添加一些东西,谁知道呢,也许这不是字符串...“

Difference between List<String> list1 = new ArrayList(); and List<String> list2 = new ArrayList<String>()

答案 3 :(得分:0)

它们混合了通用和非通用类型。考虑一下,

List<Double> t = new ArrayList(); 
List<String> stringList = new ArrayList(t);

显然,可能在运行时爆炸。 Type erasure实际上是性能提升,但这意味着Generics只是一个编译时检查,

// This is a compile error.
List<Double> t = new ArrayList<Double>(); 
List<String> stringList = new ArrayList<String>(t);

最后,在Java 7+中,您可以使用diamond operator -

// This is a compile error.
List<Double> t = new ArrayList<>(); 
List<String> stringList = new ArrayList<>(t);