2014-01-29 56 views
4

ArrayList的实现使用Array。但是,Arrays初始化为默认值(0 or null),但ArrayList只是空的。为什么是这样?为什么数组初始化为默认值,但不是在java中arraylist?

 int[] arr = new int[10]; 
     String[] arr1 = new String[11]; 
     System.out.println(Arrays.toString(arr)); 
     System.out.println(Arrays.toString(arr1)); 
     List<Integer> list = new ArrayList<Integer>(10); 
     System.out.println(list); 

     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
     [null, null, null, null, null, null, null, null, null, null, null] 
     [] 

这意味着我每次使用ArrayList时,都需要填充东西; 我想在我的代码下面的一部分,它被扔NoSuchElementException,然后我意识到,这不是违约,在那里为Arrays

if (list.get(i)==null){ 
     list.add(i,x); 
    else: 
     list.add(i,list.get(i)+x) 

编辑:

even List<Integer> list = new ArrayList<Integer>(10); 
prints [] although I initialized the size; 
+3

关于你的编辑填写新的集合(list):你没有大小设置为10。您的能力设置为10,大小为0直到你添加一个元素。 –

+0

*这意味着每次我使用ArrayList时,我都需要填充* ...是的,如果您不“填充内容”,则不会使用它。 –

+0

当您打印列表时,您看不到任何元素,因为其'toString()'方法使用'size'来确定打印的元素数量,而不是数组的容量。当你创建初始容量为10的'ArrayList'时,它的大小仍然是'0',因为你还没有添加任何元素,即使存储你的对象的数组被初始化为新的Object [10],这意味着它是充满10个空值。 – Pshemo

回答

3

当您创建一个数组时,您可以指定大小。这是必需的,因为数组的大小在创建后无法更改。然后,阵列中的每个元素都必须进行分配,最明显的是0null

另一方面,ArrayList的设计是可以调整大小的。所以你不必在创建时指定大小。如果起始大小大于零,则必须初始化所有这些元素,并且不容易。所以起始大小为零。

+0

见上在后 –

+1

你初始化什么我的编辑是能力,而不是规模。数组列表为10个元素腾出空间,但这并不意味着它有10个元素。 – tbodt

12

当构建一个数组,该数字是实际数组的大小(并且以后无法更改)。 ArrayList构造函数中的数字是初始的容量(为元素保留空间),但大小为为零。构建后,ArrayList的大小可能会更改。

+0

但它仍然可以将其值设为零或为空。如何数组列表的动态性质将影响它所包含的内容 –

+0

看到我的编辑以上在岗 –

+0

@ user1988876要调用ArrayList中的'的toString()'方法。由于它的大小是0,由toString构建的String是空的(请检查源代码)。这就是为什么你“看不到”什么。 –

2

ArrayList集合的用途几乎与阵列一样快,没有任何浪费(=预分配)的空间。因此,它被初始化为size 0(即空),而不是具有多个值(尽管实际上说底层数组被构造成指定的容量)。

话虽如此,还要注意一个ArrayList将存储的对象,而不是原语(例如,String对象,而不是charint元)。

2

我想你正在寻找Collections.nCopies

List<Integer> list = new ArrayList<Integer>(Collections.nCopies(10, 0)); 
3

你可以做这样的:

List<Integer> items = Arrays.asList(new Integer[10]); 

而且你会得到10个null元素的列表。

同样,

Integer[] numbers = new Integer[10]; 
Arrays.fill(numbers,0); 
List<Integer> list = Arrays.asList(numbers); 

,你会得到与初始化为0 10个元素的列表;

3

由于ArrayList最初并不包含任何元素,因此它不能将这些元素的值默认为null或任何其他值。

1

这是因为在ArrayList没有构造,可能造成一定规模的一个实例。 Collections.nCopies(int n, T o)允许创建具有预定义大小的列表并使用任何值对其进行初始化。顺便说一句内部它使用CopiesList类具有CopiesList(int n, E e)构造

4

null0原因是原始和Object类型之间的差异。其默认值是null0(仅false布尔)相应。 请参阅The Java Tutorial

ArrayList创建后物理上不是空的。它具有初始容量,但它显示了他的大小0即使您已将其初始化。由于收集size()具有逻辑意义,而不是物理上的。

List<Integer> list = new ArrayList<Integer>(10); 

你也可以用下面的静态方法

Collections.fill(list, 0) // int 0 is auto-boxed to `Integers` 0 
+0

注意:fill()在初始化后不能直接工作,因为列表大小= 0.请参阅nCopies()这个案例的答案。 – wrapperapps

相关问题