扩展数组?

Jam*_* MV 12 java

我知道你不能动态扩展普通数组,但这是一种有效的方法吗?

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.


Ósc*_*pez 6

你想要手工完成什么,它几乎ArrayList适合你 - 使用那个类,而不是.

在内部,ArrayList使用一个Object[]用于存储物品,在一定的容量约束.填充数组时(添加新项目),将创建一个大小加倍的新数组,并在其中复制原始数组中的所有项目.所有这些都是自动发生的,对程序员来说是透明的.

鉴于在示例代码中你存储了一个对象数组(字符串),如果你使用它ArrayList来存储它们,性能上几乎没有差别,所以没有真正的理由重新发明轮子!