我知道你不能动态扩展普通数组,但这是一种有效的方法吗?
public int size = 0;
public String[] OrigArray = new String[size+1];
public void expand(){
String[] tempArray = new String[size+1];
tempArray = (String[])OrigArray.clone();
OrigArray = new String[size+1];
OrigArray = (String[])tempArray.clone();
size++;
}
Run Code Online (Sandbox Code Playgroud)
我知道比尝试使用普通数组要好得多的方法,但是我想首先使用普通数组来解决这个问题.
我的愿望是它开始时OrigArray为0 + 1(所以1)并且当expand()被调用时,new tempArray被制作为与之相同的大小OrigArray然后保持OrigArray同时OrigArray再次声明size+1然后将tempArray其复制回新的大小OrigArray.这对我来说很有意义,但我一直在走出异常?
G. *_*ach 15
该方法不会更改OrigArray的值; 它所做的只是在其中存储克隆的克隆,因此实际上不会更改该值.
我想你想要的是这个:
public void expand() {
String[] newArray = new String[OrigArray.length + 1];
System.arraycopy(OrigArray, 0, newArray, 0, OrigArray.length);
//an alternative to using System.arraycopy would be a for-loop:
// for(int i = 0; i < OrigArray.length; i++)
// newArray[i] = OrigArray[i];
OrigArray = newArray;
}
Run Code Online (Sandbox Code Playgroud)
这将创建一个大小比OrigArray大1的数组,将OrigArray的内容复制到其中并将该数组分配给OrigArray.除非你想记住expand()被调用了多少次,否则就没有理由拥有变量size.
编辑:如果你真正想要的是知道一种方法来合理地实现你要求的功能,你可以使用@ÓscarLópez所说的并使用ArrayList.
你想要手工完成什么,它几乎ArrayList适合你 - 使用那个类,而不是.
在内部,ArrayList使用一个Object[]用于存储物品,在一定的容量约束.填充数组时(添加新项目),将创建一个大小加倍的新数组,并在其中复制原始数组中的所有项目.所有这些都是自动发生的,对程序员来说是透明的.
鉴于在示例代码中你存储了一个对象数组(字符串),如果你使用它ArrayList来存储它们,性能上几乎没有差别,所以没有真正的理由重新发明轮子!