今天我们将探讨Java中的一个主题:List集合new ArrayList<>()和new ArrayList< String >()以及new ArrayList< Object >()的区别。

1. 简介

在 Java 集合框架中,List 是一种有序集合,可以包含重复的元素。ArrayList 是 List 接口的一种实现,使用动态数组来存储元素。

List<String> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<String>();
List<Object> list3 = new ArrayList<Object>();

在上述代码中,我们创建了三个不同类型的ArrayList实例。那么这三个实例有什么区别呢?

2. new ArrayList<>()

当我们创建一个 new ArrayList<>() 时,我们正在创建一个 “raw type” 的 ArrayList。这意味着这个集合可以接受任何类型的对象。因为没有明确的类型限制,所以当我们从这个集合中取出元素时,必须进行类型转换。否则,将会引发 ClassCastException。

List list = new ArrayList();
list.add("Hello");
list.add(1);
Object obj = list.get(0); // 需要进行类型转换
String str = (String) list.get(0);
Integer intObj = (Integer) list.get(1);

3. new ArrayList< String>()

当我们创建一个 new ArrayList< String>() 时,我们正在创建一个只能存储字符串对象的ArrayList。在Java 5及更高版本中引入的泛型提供了类型安全,因此如果我们尝试将非字符串对象添加到列表中,编译器将报错。

List<String> list = new ArrayList<String>();
list.add("Hello"); // 正确
list.add(1); // 编译器错误,因为1不是String类型
String str = list.get(0); // 不需要类型转换

4. new ArrayList< Object>()

当我们创建一个 new ArrayList< Object>() 时,我们正在创建一个可以存储任何类型的对象的ArrayList,因为所有的类都是 Object 类的子类。然而,当我们从这个列表中取出元素时,如果不知道元素的实际类型,我们仍然需要进行类型转换。

List<Object> list = new ArrayList<Object>();
list.add("Hello");
list.add(1);
Object obj = list.get(0); // 不需要类型转换
String str = (String) list.get(0); // 需要类型转换
Integer intObj = (Integer) list.get(1); // 需要类型转换

5. 总结

在创建ArrayList时,我们通常应该为其指定类型。这样做的优点是能提供类型安全,并且当我们从集合中获取元素时,不需要进行类型转换。这在很大程度上避免了运行时错误。如果你不确定应该存储哪种类型的对象,那么 new ArrayList() 是一个可行的选择,但请记住,你可能需要进行类型转换。

希望这篇博客对你有所帮助。如果你有任何疑问,欢迎在评论区留言。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐