2014-11-03 32 views
0

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

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

我对ArrayLists作为初学者的理解可能有一些差距。例如:<>代表什么?它有特殊的意义吗?它在内部表现如何? (例如:我看到变量代表内存中的一个位置,数组变量作为内存中的起始位置和数组的索引作为从这个起始位置开始还有多少距离的方式。)

An我想我需要一个ArrayList的例子: (我试图创建一个用户输入整数数组,用户输入是一次一个整数,结束条件是当用户输入零时endSign = 0 。)因为Java不允许在创建数组后重新调整大小,所以我搜索了一个解决方案来创建一个动态长度的数组。 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 []数组用户放在

+0

您可以在http://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html上找到所有答案。你不能做列表 userValues;你有什么累吗?你必须使用类似列表 userValues; – StackFlowed 2014-11-03 22:15:55

+1

欢迎来到Stack Overflow。请花点时间熟悉Stack Overflow [帮助文件](http://stackoverflow.com/help),它可以帮助您了解适合本网站的哪些类型的问题。本网站旨在帮助您获得*特定编程问题*的答案,而不是提供教程,设计或代码审阅帮助。请阅读关于列表实现的Java教程,以及关于泛型的信息。使用Google查找教程。 – MarsAtomic 2014-11-03 22:19:40

+1

<>主要是为了模板化你的课程。这是非常面向对象和通用的方法。这在C++中也是可用的,这个想法就是让你的类型保持灵活性,并且在编译期间分配类型。编译器需要知道的是模板应该如何实现,即模板类/函数的定义。 – ha9u63ar 2014-11-03 22:25:50

回答

2

<>类型参数。他们是给你指定哪种类型的对象将被存储在该列表中。你不能使用基本类型作为类型参数。您只能将对象存储在列表中,而不是原始类型。退房The Java Tutorials - Generics

ArrayListCollection,还有其他类型的集合(如LinkedList和一些同步集合。你可以在The Java Tutorials - Collections了解集合)。您可以逐个查看每个人,看看他们擅长的地方。也有Maps,你应该看看。它们的大小也是动态增长的,但不是存储单个对象,而是存储一个键/值对。

你的主要想法是:阵列不会改变大小。 List s需要时动态增长。在使用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对象。

1

一几件事情,可能会有所帮助:

  1. ArrayList<Element>ElementArrayList数据类型。这意味着,列表中的每个项目都是Element(Element类接口的一个实例)类型。这些标签是在Java 5中引入的,被称为泛型。这是一种在编译时解决数据类型兼容性的机制,而不是等到你运行代码并找出你有某种问题(即ClassCastException)。在运行时使用泛型没有任何优势。
  2. 您可以使用userValues.toArray()返回数组而不是List
  3. 不允许使用整数列表。您必须改用包装类Integer。使用Java拆箱机制,Integer会自动转换为原始文件int。自动装箱是相反的:是将原语转换为与其等价的包装类的过程;在这种情况下从intInteger
  4. 是的,如果您不确定您需要的阵列的大小,可以使用ArrayList并调用toArray()方法并返回与上述第2项中所述的数组等效的数组。

我希望这会有所帮助。

相关问题