如何将数组的副本放入Android中的新数组中

时间:2013-08-26 07:56:16

标签: java android arrays

我有一个数组,现在我想创建该数组的副本,以便我可以保留数组的先前值。

我试过这样的事情:

System.arraycopy(firstArray, 0, secondArray, 0, firstArray.length);

但它给了我一个NullPointerException,即:

08-26 13:20:08.421: E/AndroidRuntime(23739): FATAL EXCEPTION: main
08-26 13:20:08.421: E/AndroidRuntime(23739): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.iweentravel/com.android.iweentravel.MainAcvtivity}: java.lang.NullPointerException: dst == null
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2211)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.ActivityThread.access$600(ActivityThread.java:149)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1300)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.os.Looper.loop(Looper.java:153)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.ActivityThread.main(ActivityThread.java:4987)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at java.lang.reflect.Method.invokeNative(Native Method)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at java.lang.reflect.Method.invoke(Method.java:511)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at dalvik.system.NativeStart.main(Native Method)
08-26 13:20:08.421: E/AndroidRuntime(23739): Caused by: java.lang.NullPointerException: dst == null
08-26 13:20:08.421: E/AndroidRuntime(23739):    at java.lang.System.arraycopy(Native Method)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at com.android.iweentravel.MainAcvtivity.onCreate(MainAcvtivity.java:99)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.Activity.performCreate(Activity.java:5020)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
08-26 13:20:08.421: E/AndroidRuntime(23739):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
08-26 13:20:08.421: E/AndroidRuntime(23739):    ... 11 more

请建议我如何正确创建数组副本。

4 个答案:

答案 0 :(得分:2)

作为例外情况,您没有为目的地分配内存。在System.arrayCopy调用之前

secondArray = new String[first.length]

如果secondArray属于String类型。否则你必须相应地改变它

答案 1 :(得分:0)

非常简单试试这个

String arr2[] = arr1.clone();

答案 2 :(得分:0)

根据你获得的异常判断,我会说secondArray参数为null。

您可以通过简单的“克隆”来复制任何数组,如下所示:

String [] copy = orig.clone();

它将使用一组新指针构造一个新数组。这将允许您修改新阵列,而不会打扰原始阵列。

请注意,当您的数组包含对象时,不会复制数组CONTENT。新数组只是一组指向相同数据的新指针。观察:

Object[] a1 = new Object[3];
a1[0] = objectA;
a1[1] = objectB;
a1[2] = objectC;
Object[] a2 = a1.clone();

a2 [0]现在指向与a1 [0]完全相同的对象实例。因此,如果要修改指向a2 [0]的对象中的某些内容,则实际上会改变为a1 [0]指向的对象。

如果你不想要这个,你必须做类似的事情:

Object[] a2 = new Object[a1.length];
for (int n=0; n<a1.length; ++n)
  a2[n] = a1[n].clone();

将导致数组a1的所谓深度复制。

另请注意,在String数组的情况下不会出现此问题,因为字符串是不可变的。

HTH

答案 3 :(得分:0)

String[] secondArray = new String[first.length]

for(int i=0; i<firstArray.length; i++){
   secondArray[i]=firstArray[i]
}