List<String> stringList = new ArrayList<String>() 和 List<String> stringList = new ArrayList() 有什么区别?

6
我知道在Java中声明和初始化变量有两种方式。
List<String> stringList = new ArrayList<String>() 

List<String> stringList = new ArrayList()?

但它们之间到底有什么区别?

另外,你更喜欢如何命名列表变量?是使用variableList还是只是variables?或者你有其他的方法吗?

4个回答

11

其实并没有区别,但第二种会产生编译警告。

它们编译成相同的字节码,因为编译器会舍弃有关你使用了哪些类型参数的信息。

问题在于,在泛型出现之前,ArrayList类已经存在,所以我们过去一直要将其创建为 new ArrayList(),而不指定类型参数。现在使用泛型,我们可以指定要存储在 ArrayList 中的对象的类型,并让编译器检查我们是否正确使用它。你在第一个例子中使用的表示法就是这样。

但编译器随后进行的任何检查都基于变量的类型,而不是你创建的类的类型,因此除了初始的编译器警告外,这种差异将完全没有影响。

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


1
我们什么时候才能停止提到泛型之前的时间? - Sotirios Delimanolis
@SotiriosDelimanolis 当Oracle尝试制作一个像样的日期/时间API并最终得出只能表示2004年以后日期的东西时,当然。 - Dawood ibn Kareem
1
是的,我出生于2004年。我认为在那之前世界不存在 :) - Sotirios Delimanolis
1
正确,@Sotirios,在你出生的前一天整个世界都被创造出来了,只为了你的个人娱乐。这就是为什么 Stack Exchange 服务器离你家这么近的原因。 - Dawood ibn Kareem

4

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

列表里面有什么?例如:如果它是我刚从宠物店买的小狗袋:

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

注意我省略了type:,这是因为Java 7支持此操作,与以下代码完全相同:

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

我省略了第一部分,没有看到两者都声明为 List<String>。我只会对命名做出评论,David已经谈到了实例化。 - Jeroen Vannevel

1
“是的,这种做法是允许的,以实现与之前Java版本的向后兼容性。 但是,你不想像这样编码。 考虑以下内容:”
List objList = new ArrayList();
objList.add(new Object());

List<String> list = objList;

编译器可以编译这个,但你猜猜在List中得到了什么?一个对象!声明一个Collection时,你想确保只有字符串在里面,而原始类型的集合允许你添加任何东西。重构后,你的新ArrayList()可能会从一个单独的方法返回。也许第二天有人会添加一些东西,谁知道,也许这些东西不是字符串... List<String> list1 = new ArrayList();和List<String> list2 = new ArrayList<String>()的区别

0

他们混合使用泛型和非泛型类型。考虑一下这个问题,

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

显然,这可能会在运行时出现问题。 类型擦除 真的是性能提升,但这意味着泛型只能在编译时进行检查。

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

最后,在Java 7或以上版本中,您可以使用菱形操作符
// This is a compile error.
List<Double> t = new ArrayList<>(); 
List<String> stringList = new ArrayList<>(t);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接