2012-10-30 119 views
1

我想將一個數組傳遞給一個方法,但我知道數組是通過引用傳遞的,所以原始數組會被修改。我發現的一項工作是在該方法內部創建數組副本,然後修改副本,但傳遞數組副本的最佳方式是什麼,或者最好在方法內部創建副本。這裏是我的代碼 看看相反的方法ArrayUtils類什麼是在java中傳遞數組的最佳方式

package com.javablackbelt.utils; 

import java.util.ArrayList; 
import java.util.Arrays; 

public class ListUtils { 

    public static void main(String arg[]) { 
     String[] arr = {"one", "two", "three", "four", "five"}; 
     ArrayUtils.print(arr); 

     System.out.println(); 

     String [] reversedArr = ArrayUtils.reverse(arr); 
     ArrayUtils.print(reversedArr); 

     System.out.println(); 

     ArrayList<String> list = ArrayUtils.toArrayList(arr); 
     ListUtils.print(list);  

    } 

    public static void print(ArrayList<String> aStr) { 
     System.out.print("list: [ "); 
     for(String l: aStr) 
      System.out.print(l+" "); 
     System.out.println(" ] size: "+aStr.size()); 
    } 

} 

package com.javablackbelt.utils; 

import java.util.Arrays; 
import java.util.Collections; 
import java.util.List; 
import java.util.ArrayList; 

public class ArrayUtils { 

    public static void print(String[] arr) { 
     System.out.print("Array: [ "); 
     for(String str: arr) { 
      if(str != null) 
       System.out.print(str.toString()+" "); 
     } 
     System.out.print(" ] size: "+arr.length); 
    } 

    public static String[] reverse(String[] arr) { 
     String[] a = arr; 

     List<String> list = Arrays.asList(a); 

     Collections.reverse(list); 

     String[] newArr = (String[]) list.toArray(); 

     return newArr; 
    } 

    public static ArrayList<String> toArrayList(String[] arr) { 

     ArrayList<String> arrList = new ArrayList<String>(); 

     for(int i = arr.length-1; i >= 0; i--) 
      arrList.add(arr[i]); 
     return arrList;  
    } 

} 
+0

你的要求是什麼,不想修改原始數組? – kosa

+0

你的方式看起來不錯。也許可以縮短代碼(對我們來說)。 – keyser

+0

Btw數組「不通過引用傳遞」。它們是通過參考值傳遞的。請記住,Java中的所有內容都是按值傳遞的。 –

回答

1

可以創建數組的副本,因此從編輯原始陣列保存,

  1. System.arraycopy(srcArray,0,0 destArray,srcArray.length);
  2. srcArray.clone()
0

你必須在陣列複製。有幾種方法可實現的,但對於這個原因,它通常是更容易使用的實際對象,如ArrayList對象,而不是一個「原始」數組:

String[] myPrimitiveArrayOfStrings; 
ArrayList<String> myObjectArrayOfStrings = new ; 

後一種方法(使用'泛型「)在您如何利用陣列方面爲您提供了很大的靈活性。它使排序,搜索,擴展數組中的對象以及其他許多事情變得更加容易。

也就是說,Array類爲您提供了一些實用程序。

爲了記錄,在Java對象中不是通過引用傳遞,而是通過引用的值傳遞。這意味着指向該對象的指針被複制。如果原始指針被刪除,該指針仍然存在。只有一旦所有指針被刪除,對象纔會被垃圾收集。

1

有沒有最佳答案。有時修改傳遞數組是正常的(例如,Arrays.sort()),有時不是。關鍵是記錄方法,並讓主叫方尊重合同。

我會發現它正常的方法,返回一個輸入數組的變換數組,以保持輸入數組未經修改,我會發現它不好創建副本之前傳遞一個數組這樣的方法,只是在案件。有了明確的文件,毫無疑問。

集合通常應該優先於數組。通過收藏,您不必創建副本來保護自己。你可以將這個集合包裝在一個未修改的集合中:Collections.unmodifiableList(list)

相關問題