2014-05-23 138 views
1

从概念上讲,这里发生了什么?将ArrayList添加到ArrayList

我有一个ArrayList

ArrayList<SomeClass> myArray = new ArrayList<SomeClass>(); 

然后我添加的东西给它这样的

myArray.add(new myArray(1, 2, 3)); 
+0

可能重复[?如何连接在Java中的两个阵列(http://stackoverflow.com/questions/80476/how-to-concatenate-two-arrays-in -java) –

+0

'myArray'是'ArrayList' – Reimeus

+0

@JoelWitteveen,这是不正确的。问题是关于数组列表包含数组的方式 –

回答

2

我有一个数组

ArrayList myArray = new ArrayList(); 

不,你不”有一个数组。阵列使用brackes []声明,就像这样:

int[] myArray; 

你有ArrayList类的对象。该对象将在内部使用数组来存储数据,并在需要分配更多值时动态更改新数组的数组。

然后我添加的东西给它这样的

myArray.add(new myArray(1, 2, 3)); 

概念上,这是错误的,甚至不会编译。如果您想要在数组中添加多个值,则应使用ArrayList#addAll方法,该方法会接收另一个集合。然后,你有两种方式来传递一个Collection在一个声明:

  1. 使用Arrays#asList创建一个列表:

    myArray.addAll(Arrays.asList(1, 2, 3)); 
    
  2. 您可以使用双大括号初始化:

    myArray.addAll(new ArrayList() {{ 
         add(1); 
         add(2); 
         add(3); 
        }}); 
    

你应该考虑到,你应该指定,而不是使用原始数据一般为您ArrayList

ArrayList<Integer> myArray = new ArrayList<Integer>(); 
myArray.addAll(new ArrayList<Integer>() {{ 
     add(1); 
     add(2); 
     add(3); 
    }}); 

更多信息:


请注意,如果你有一个ArrayList被绑定到自定义类,比方说ArrayList<SomeClass> myArrayList,那么编译器会阻止您添加元素,以不通过IS-A测试(由instanceof操作说明)列表,所以这段代码:

ArrayList<SomeClass> myArrayList = new ArrayList<SomeClass>(); 
myArrayList..addAll(new ArrayList<Integer>() {{ 
     add(1); 
     add(2); 
     add(3); 
    }}); 

由于Integer不是SomeClass,因此将无法编译。类似与这段代码:

ArrayList<SomeClass> myArrayList = new ArrayList<SomeClass>(); 
myArray.add(Arrays.asList(1, 2, 3)); 

但由于type erasure您可以通过使用原始类型的欺骗编译器。例如:

public void addData(ArrayList yourArrayList, Object anyData) { 
    yourArrayList.add(anyData); 
} 

然后在你的代码,调用此方法:

ArrayList<String> myArrayList = new ArrayList<String>(); //allows Strings only 
myArrayList.add("Hello world"); 
//myArrayList.add(0); //this won't compile because trying to add an Integer 
addData(myArrayList, 0); //this will compile for using raw ArrayList and sending an Integer 
System.out.println(myArrayList); 

它会打印:

[Hello world, 0] 
+2

“**概念上这里发生了什么?**” –

+0

如果你知道添加的数组列表的大小,那将会很好ArrayList的大小:'new ArrayList(size)' – herau

+0

@LuiggiMendoza他似乎在问什么是数组列表/它是如何工作的。没有其他的。 –

0
myArray.add(new myArray(1, 2, 3)); 

这是不正确的,不编译,因为myArray不是一种类型,它只是一个参考,您需要某种类型的整数,或者如果您想添加另一个列表,则使用addAll

你可以使用这样的东西。

List<Integer> myArray = new ArrayList<>(); // specify with generics type parameter 
//do some things and then 
myArray.addAll(Arrays.asList(1,2,3)); // use this helper method to add a list to another list 

或者,如果你只想创建和填充,只需要使用

List<Integer> myArray = Arrays.asList(1,2,3,4,5); 
+0

用户问:“**概念上是怎么回事?**” –

+0

@JordanD编辑 – nachokk

0

我想我知道你想要做什么,说你有这个。

ArrayList<Integer[]> myArray = new ArrayList<Integer[]>(); 

和你想的阵列添加到它,你基本上要打电话

myArray.add(((Integer[]) new int[] { 0, 1, 2 })); 

将在ArrayList中的数组[0,1,2]添加到下一个索引。

对于〔实施例,下面的代码

ArrayList<Integer[]> myArray = new ArrayList<Integer[]>(); 
myArray.add(((Integer[]) new int[] { 0, 1, 2 })); 
myArray.add(((Integer[]) new int[] { 1, 0, 2 })); 
myArray.add(((Integer[]) new int[] { 3, 2, 1 })); 

会造成以下结果:

myArray index 0 = [0, 1, 2] 
myArray index 1 = [1, 0, 2] 
myArray index 2 = [3, 2, 1] 

这是你的问题?

0

实际上你并没有一个数组,你有一个ArrayList。 ArrayList是List接口的可调整大小的实现。这意味着,除其他外,您不必像定义数组那样定义长度。

我不认为你已经提供了将实际编译,因为当你去代码:

myArray.add(new myArray(1, 2, 3)); 

你没有提供一个类型。你应该去类似:

myArray.add(new ArrayList<Integer>(Arrays.asList(1,2,3))); 

使用asList()几乎给数组分配“默认”值相当于。该阵列相当于将是这个样子:

Integer[] intArray = new Integer[] {1,2,3}; 

你也应该参数的ArrayList(S),这基本上意味着你在说什么的ArrayList可以容纳。例如:

ArrayList<Integer> 

可以保持整数。

原因你必须使用一个包装类(Integer &不int)是因为在Java集合不允许您存储原始类型,例如intdouble

您可以拥有一个集合,持有另一个集合。在这种情况下,你可以去:

ArrayList<ArrayList<Integer>> myArrayList = new ArrayList<ArrayList<Integer>>(); 
    myArrayList.add(new ArrayList<Integer>(Arrays.asList(1, 2, 3))); 
    myArrayList.add(new ArrayList<Integer>(Arrays.asList(9, 12, 24))); 
    for (ArrayList<Integer> index : myArrayList) { 
     System.out.println(index); 
    } 

在这里你有一个ArrayList控制其他两个ArrayList。这导致的打印:

[1, 2, 3] 
[9, 12, 24]