2012-04-21 56 views
13

我有一个快速的问题。我有一个Java中的整型数组,需要它的长度在整个类中变化。具体来说,我需要在某些情况下增加1。我试过这样。如何增加阵列长度

 sbgHeadX = new int[ numberOfSBG ]; 

我会增加整数变量numberOfSBG当我需要,但我不认为这个工程。有没有其他方法?

+0

你能提供一个合理的最大值。显然你的数组永远不会比Integer.MAX_VALUE大,但是如果你知道你的数组也不会超过300,你可以将它的长度设置为300. – emory 2012-04-21 01:42:47

+0

@emory - 个人而言,我会考虑这样做是一个强大的代码味道:结果是一个数组,其中一些元素是“不应该被使用”的。这是一种容易出错且笨拙的编码风格,需要在有效元素的数量上传递一个单独的变量。还打破了'.size()'产生要处理的元素数量的假设。 – ToolmakerSteve 2015-09-13 15:37:00

回答

13

我会建议你使用ArrayList,你将不必担心长了。一旦创建,则不能修改的阵列大小:

数组是保存单个类型的值的一个固定数目的容器对象。创建数组时创建数组的长度。创建后,其长度是固定的。

Source

+0

我将如何访问数组列表的特定索引? – kullalok 2012-04-21 02:33:48

+1

@ user1276078'yourArraylist.get(2)'相当于'yourClassicArray [2]' – talnicolas 2012-04-21 02:41:52

+1

虽然这可行,但这可能会导致不必要的自动装箱,因为OP指示它是原始的int。 Java集合需要Object作为它们的值,所以每次调用集合方法时,JVM都会将所有值转换为Integer。随着时间的推移,这可能会增加成本。很明显,程序员需要决定是否值得像Hunter McMillen所建议的那样“开销”,但他的回答是,恕我直言,这个问题更准确。 – 2013-12-02 15:10:26

1

定义数组的大小是固定的。你可以使用一个Arraylist,这是一个“动态大小”数组。实际上发生的事情是虚拟机“调整由ArrayList暴露的数组的大小”*。

See also

*使用背复制阵列

+3

*“实际上发生的事情是VM调整阵列列表暴露的数组的大小。”*。不正确。实际上,'ArrayList'的代码创建一个新的后备数组并复制现有数据的内容。数组长度不能改变......即使通过JVM。这将违反Java语言规范。 – 2012-04-21 01:37:42

+1

@StephenC你说得对。诠释错误。 – 2012-04-21 01:39:28

+0

你仍然只有一半的权利。这不是JVM进行调整。 ArrayList类在普通的Java代码中完成它。并且数组不会暴露在数组列表中...它是由数组列表隐藏的私有对象。 – 2012-04-21 02:11:14

18

如果你不想或者不能使用ArrayList,然后有一个实用的方法:

Arrays.copyOf() 

,将允许您指定新的大小,同时保留元素。

+2

“该算法在许多数据集上提供n * log(n)性能,这些数据集会导致其他快速排序降至二次性能。” – 2012-04-21 01:34:19

21

Java中的数组具有固定大小,它们在声明时指定。要增加数组的大小,您必须创建一个更大大小的新数组,并将所有旧值复制到新数组中。

例如:

char[] copyFrom = { 'a', 'b', 'c', 'd', 'e' }; 
char[] copyTo = new char[7]; 

System.out.println(Arrays.toString(copyFrom)); 
System.arraycopy(copyFrom, 0, copyTo, 0, copyFrom.length); 
System.out.println(Arrays.toString(copyTo)); 

另外,您可以使用动态数据结构是怎样的一个列表。

+2

恕我直言,在Jakub的答案中使用'Arrays.copyOf()',会使代码更短,更具可读性。 – ToolmakerSteve 2015-09-13 15:34:15

0
Item[] newItemList = new Item[itemList.length+1]; 
    //for loop to go thorough the list one by one 
    for(int i=0; i< itemList.length;i++){ 
     //value is stored here in the new list from the old one 
     newItemList[i]=itemList[i]; 
    } 
    //all the values of the itemLists are stored in a bigger array named newItemList 
    itemList=newItemList; 
0

您可以使用ArrayList。数组的大小是固定的。

Example这里可以帮助你。这个例子很容易输出。

 
Output: 
2 5 1 23 14 
New length: 20
Element at Index 5:29
List size: 6
Removing element at index 2: 1
2 5 23 14 29