【问题标题】:In clear terms what is an ArrayList and how to use it? [closed]明确地说什么是 ArrayList 以及如何使用它? [关闭]
【发布时间】:2014-11-03 22:12:32
【问题描述】:

如果我查看什么是 ArrayList 以及如何使用它,我经常会感到困惑。例如,当我看到这个时,我会感到害怕:

new ArrayList<Element>(Arrays.asList(array))

作为初学者,我对 ArrayLists 的理解可能存在一些差距。例如:&lt;&gt; 代表什么?它有特殊意义吗?它是如何在内部表示的? (例如:我认为变量表示内存中的一个位置,数组变量表示内存中的起始位置,数组的索引表示距离该起始位置还有多远。)

我认为需要 ArrayList 的示例: (我试图创建一个用户输入的整数数组。用户输入一次是一个整数,结束条件是用户输入零时endSign = 0。)不允许在创建后重新调整数组大小,我搜索了一种解决方案来创建动态长度的数组。如果我理解正确的话,如果我最后将 ArrayList 转换为数组,它似乎是一个选项?如果是这种情况,那么在这里使用 ArrayList 可能会很有用:

    private int[] userInput(int endSign){ //end-sign is 0 in this case
    int validInputCounter=0;
    List<int> userValues;
    int value;
    do{
        value = readInt(); //reads integer user-input
        if(value != endSign){ 
            validInputCounter++;
            userValues += value;  
        }else{
        break;
        }
    }while(true);
    return userValues;  
}

在这段代码中,我想返回一个用户输入的 int[] 数组。

【问题讨论】:

  • 您可以在docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html 上找到所有答案。你不能做 List userValues;你累了吗?你必须使用像 List userValues; 这样的泛型
  • 欢迎来到 Stack Overflow。请花点时间熟悉 Stack Overflow help file,这将帮助您了解适合本网站的问题类型。本网站旨在帮助您获得特定编程问题的答案,而不是提供教程、设计或代码审查帮助。阅读有关列表实现的 Java 教程,并单独阅读有关泛型的 Java 教程。使用 Google 查找教程。
  • 主要与“模板化”您的课程有关。这是非常面向对象和通用的方法。这在 C++ 中也可用,其想法是保持类型灵活,并在编译时分配类型。编译器需要知道的只是模板应该如何实现,即模板类/函数的定义。
  • @MarsAtomic 我真的尽了最大努力使这个问题成为一个合适的问题并自己找到解决方案。我从未听说过集合和泛型、地图等等。我读到的一切都让我更加困惑。现在我得到了关于重要主题的线索。我问这个问题的原因是因为我包含了一个特定的编程问题。

标签: java arrays arraylist


【解决方案1】:

&lt;&gt;类型参数。它们供您指定将存储在该列表中的对象类型。您不能将原始类型用作类型参数。您只能将对象存储在列表中,而不是原语中。查看The Java Tutorials - Generics

ArrayListCollection,还有其他类型的集合(例如LinkedList 和一些同步集合。您可以在The Java Tutorials - Collections 阅读有关集合的信息)。您可以单独研究每一个,看看它们在哪里擅长。还有Maps,你应该看看。它们的大小也会动态增长,但它们不是存储单个对象,而是存储一个键/对值。

您的主要思想是正确的:数组的大小不会改变。 Lists 在需要时动态增长。

ArrayList 使用示例:

class Demo {
     public static void main(String[] args) {
          ArrayList<Integer> intList = new ArrayList<>();
          ArrayList<String> stringList = new ArrayList<>();

          intList.add(1);
          intList.add("s"); //error

          stringList.add("s");
          stringList.add(2); //error
     }
}

我建议阅读The Java Tutorials - Autoboxing and Unboxing,因为您不能使用原始类型作为类型参数。我们添加到 intList 的原语 1 将被装箱到一个对象中,因为该列表采用 Integer 个对象。

【讨论】:

    【解决方案2】:

    您是否尝试过在线 Java 教程?您在这里有几个与集合和泛型( 语法)有关的不同问题,所以先看看这里:http://docs.oracle.com/javase/tutorial/

    具体来说, 收藏:http://docs.oracle.com/javase/tutorial/collections/index.html 对于泛型:http://docs.oracle.com/javase/tutorial/extra/generics/index.html

    【讨论】:

      【解决方案3】:

      一些可能有帮助的事情:

      1. ArrayList&lt;Element&gt; 指的是 ArrayListElement 数据类型。也就是说,列表中的每一项都是Element 的类型(接口的Element 类的一个实例)。这些标签是在 Java 5 中引入的,被称为泛型。这是一种在编译时解决数据类型兼容性的机制,而不是等到您运行代码并发现您有某种问题(即 ClassCastException)。在运行时使用泛型没有任何好处。
      2. 您可以使用userValues.toArray() 来返回一个数组而不是List
      3. 不允许使用整数列表。您必须改用包装类Integer。使用 Java 拆箱机制,Integer 会自动转换为原始 int。自动装箱则相反:是将原语转换为其等效包装类的过程;在这种情况下,从 intInteger
      4. 是的,如果您不确定数组的大小,您可以使用ArrayList 并调用toArray() 方法并返回上面第2 项中所述的等效数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        相关资源
        最近更新 更多