繁体   English   中英

ArrayList中的通用集合

[英]Generic Collections in ArrayList

我试图以我的入门Java知识为基础,并涉足数据结构。

我正在看ArrayList ,但我不理解以下内容:

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

我用谷歌搜索了type parameter但是我真的不明白为什么它是必需的,它在做什么(都包括调用构造函数和初始化变量); 如果有人可以简单地说给我解释,那就太好了。

谢谢

首先,我强烈建议您阅读Java泛型教程

其次,简单回答您的问题。 通过使用这样的通用类型,您将迫使编译器使用此实例对代码使用强类型检查。

如果您将列表定义为:

List myList = new ArrayList();

您将能够向其添加任何类型的对象,例如:

myList.add(new Integer());
myList.add(new Long());

通过将列表声明为:

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

您告诉编译器此列表将仅接受字符串,因此:

myList.add(new Integer());

将抛出编译时错误。

在Java 7中,您可以改用Diamond运算符(如果有帮助,可以将其视为逆类型推断),因此:

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

这意味着你只能添加对象名单是类的String或子类的String

与接口类相比,泛型通常对接口更有用。

在您的情况下,字符串的type参数表示ArrayList只能容纳String,不允许其他类型。 当您从ArrayList检索值时,它还可以确保输出为String并可以直接分配给String,这也有帮助。

使用此声明,您只需设置ArrayList的数据类型。 这样,您可以确保ArrayList是字符串数组

要理解这一点,您需要了解泛型在Java中的工作方式。 简而言之,该类型允许Generic ArrayList将每个元素转换为类型,然后将每个对象作为类型返回。

实现看起来像这样

public class ArrayList<T>{

    public void add(T element)
    public <T> get()

}

在您的示例中,这允许您将数组列表与字符串一起使用

在后台对象仍然是对象,但是每个读取/写入访问权限都在Castet中。

因此,您拥有类似类型安全性的东西(可以在此处阅读 ,可以将其破坏)。

泛型告诉编译器ArrayList只能包含String对象。

这是泛型的一个例子,但是在一段时间内你可能不知道泛型的细节-教程将告诉你如何编写像ArrayList这样的类; 现在,您只需知道如何使用它。

在泛型之前,您需要声明如下列表:

List l = new ArrayList();

...,而List包含对象的集合。 Java运行时并不关心您放入哪种对象。

l.add(new Integer(3);
l.add("A String");

...并且Java运行时无法告诉您取出的对象是什么类型的,因此您必须强制转换它:

String s = (String) l.get(1); // throws a ClassCastException if object is not a String

这意味着各种编程错误的, 可以由编译器进行检测,如果只有语言能更好地表达自己,只能够在运行时被抓获。

因此,让我们添加一些内容,说明列表包含的内容:

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

这意味着您只能add()字符串add()到列表中,并且从列表中get()任何内容都将是一个字符串:

l.add(new Integer(1)); // compile error -- incompatible types
l.add("Hello"); // works
String s = l.get(0); // works, without casting 

它适用于多态性。 因此,如果AppleBananaFruit子类:

List<Fruit> fruitList = new ArrayList<Fruit>();
fruitList.add(new Apple());
fruitList.add(new Banana());

如果查看List的JavaDoc,您会看到它记录为List<E> -其中E是声明变量时插入的任何类型的占位符。

这些方法的记录方式相同: boolean add(E e)E get(int index)等等。

泛型的主要用途是提供类型安全性。 如果不使用泛型,则对象将作为对象类型的引用出现。 在泛型之前,无法声明数组列表的类型,因此默认情况下,其add()方法采用类型对象。

对于简单的例如。 了解泛型如下

        ArrayList<String> l=new ArrayList<String>(); 
        l.add(null); // It will add type of string

在这里,使用泛型,您现在只能将字符串对象放入ArrayList中,这些对象将作为字符串类型的引用出现。

简而言之,使用泛型可以创建类型安全的集合,在编译时而不是运行时捕获更多问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM