Java:陣列和集合類作為引數傳遞時的差別(問題解決,謝謝大家提醒)

DM--Tutor發表於2012-11-13

       最近在做專案時遇到一個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是沒有變化的,哎,寫到這裡,有想到了自己可憐的基礎知識了,還是需要慢慢積累吧,加油!

相關文章