最近在做項目時遇到一個List集合作爲參數傳遞的問題,想起了以前總結的參數傳遞,參數傳遞包括值傳遞和引用傳遞,集合類的參數應該屬於引用傳遞,腦子裏突然就閃現到了數組,感覺數組也是一種特殊的集合,也應該是引用傳遞,於是就舉了個簡單的例子作爲測試,但是測試結果大跌眼鏡,數組居然沒有實現像List集合那樣的效果,現將問題羅列出來,請各位前輩指教,等問題解決後會做一下小結。問題如下
首先定義一個類Test1:
public class Test1 {
//這部分是針對list的操作,首先定義一個空的list集合容器
List<String> list=null;
//用list集合容器作爲參數的構造方法
public Test1(List<String> list)
{
super();
this.list=list;
}
//對容器增加數據
public void putList(){
list.add("list1");
list.add("list2");
list.add("list3");
}
//------------------------------------------------------------------
//這部分是對數組的操作,首先定義一個空的數組
String[] str=null;
//用數組作爲參數的構造方法
public Test1(String[] str)
{
this.str=str;
}
//對數組增加數據
public void putString()
{
str=new String[]{"string1"};
}
}
該類中分別定義了對List集合和數組Str的處理。對於List集合,首先定義一個List集合作爲參數的集合,然後再通過方法putList()對集合進行數據增加,對於數據也做了類似的操作,然後定義一個操作類Test2:
public class Test2 {
//定義空的list集合以及數組
static List<String> list=null;
static String[] str=null;
//返回一個list集合類型的數據
public static List<String> getList()
{
List<String> test=new ArrayList<String>();
Test1 test1=new Test1(test);
test1.putList();
return test;
}
//返回一個數組類型的數據
public static String[] getString()
{
String[] test=new String[]{"string2"};
Test1 test1=new Test1(test);
test1.putString();
return test;
}
public static void main(String[] args)
{
//將getList()方法中得到的list集合傳遞給list,並顯示其中的內容
list=getList();
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();)
{
System.out.println("List集合結果爲:"+iterator.next().toString());
}
//將getString()方法中得到的數組傳遞給str,並顯示其中的內容
str=getString();
for(int i=0;i<str.length;i++)
{
System.out.println("數組結果爲:"+str[i]);
}
}
}
該類中分別定義了空的List集合和數組和得到各自類型的方法,然後在主方法中分別打印出List集合和數組中的值,結果如下:
List集合結果爲:list1
List集合結果爲:list2
List集合結果爲:list3
數組結果爲:string2
問題:List集合在作爲參數傳遞的時候是地址引用傳遞,所以在類Test2的getList()方法中,定義的LIst類型的test作爲參數傳遞爲Test1的構造方法後通過this.list=list把test的地址給Test1中的成員變量list,再通過調用test1中的putList()方法對list進行添加數據,由於是地址引用所以也就改變了傳過來的test的值,最終test的也增加了list1,list2,list3,再通過return test使方法返回一個增添了數據的List集合,最終賦值給Test2中的成員變量list並輸出,得到結果,結果也是預料之內的,問題就在於對數組操作的結果,因爲兩個操作是一樣的,在Test2的getString()方法中定義了一個數組test並且對其進行了賦值,再把它作爲參數傳遞給Test1的構造方法,通過test1的putString()方法對其修改,這時test的值應該是修改後的值即:string1,但是輸出來後還是原來的值string2,這不就成了值傳遞了嗎,沒有對數組進行改變?
問題解決方法:首先一點,List集合和數組作爲參數時一定是進行地址引用傳遞的,但是自己在編寫程序時出現了錯誤,在Test2中傳入數組test後,Test1中的數組str指向這個數組,但是在類Test1中的putString()方法中,將數組str指向了一個新的數組地址,這樣對str進行操作就不會影響到test了,所以在getString()方法中test是沒有變化的,哎,寫到這裏,有想到了自己可憐的基礎知識了,還是需要慢慢積累吧,加油!