从概念上讲,这里发生了什么?将ArrayList添加到ArrayList
我有一个ArrayList
ArrayList<SomeClass> myArray = new ArrayList<SomeClass>();
然后我添加的东西给它这样的
myArray.add(new myArray(1, 2, 3));
从概念上讲,这里发生了什么?将ArrayList添加到ArrayList
我有一个ArrayList
ArrayList<SomeClass> myArray = new ArrayList<SomeClass>();
然后我添加的东西给它这样的
myArray.add(new myArray(1, 2, 3));
我有一个数组
ArrayList myArray = new ArrayList();
不,你不”有一个数组。阵列使用brackes []
声明,就像这样:
int[] myArray;
你有ArrayList
类的对象。该对象将在内部使用数组来存储数据,并在需要分配更多值时动态更改新数组的数组。
然后我添加的东西给它这样的
myArray.add(new myArray(1, 2, 3));
概念上,这是错误的,甚至不会编译。如果您想要在数组中添加多个值,则应使用ArrayList#addAll
方法,该方法会接收另一个集合。然后,你有两种方式来传递一个Collection
在一个声明:
使用Arrays#asList
创建一个列表:
myArray.addAll(Arrays.asList(1, 2, 3));
您可以使用双大括号初始化:
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]
“**概念上这里发生了什么?**” –
如果你知道添加的数组列表的大小,那将会很好ArrayList的大小:'new ArrayList(size)' – herau
@LuiggiMendoza他似乎在问什么是数组列表/它是如何工作的。没有其他的。 –
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);
用户问:“**概念上是怎么回事?**” –
@JordanD编辑 – nachokk
我想我知道你想要做什么,说你有这个。
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]
这是你的问题?
实际上你并没有一个数组,你有一个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集合不允许您存储原始类型,例如int
或double
。
您可以拥有一个集合,持有另一个集合。在这种情况下,你可以去:
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]
的
可能重复[?如何连接在Java中的两个阵列(http://stackoverflow.com/questions/80476/how-to-concatenate-two-arrays-in -java) –
'myArray'是'ArrayList' – Reimeus
@JoelWitteveen,这是不正确的。问题是关于数组列表包含数组的方式 –