Java:陣列和集合類作為引數傳遞時的差別(問題解決,謝謝大家提醒)
最近在做專案時遇到一個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是沒有變化的,哎,寫到這裡,有想到了自己可憐的基礎知識了,還是需要慢慢積累吧,加油!
相關文章
- 重要問題,連結mysql錯誤,怎麼解決啊,謝謝大家MySql
- 將函式作為引數傳遞解決非同步問題函式非同步
- 二維陣列作為引數傳遞問題陣列
- 關於jsp拒絕訪問的問題,謝謝大家JS
- 引數為*&與*的區別以及二維陣列傳遞時列數不對等的區別陣列
- 哈哈!樓下問題解決!謝謝,各位前輩!
- activemq的問題,謝謝MQ
- Shell自學二(引數傳遞和陣列)陣列
- rake 任務引數傳遞問題解決
- 測試問題思考,有些問題我自己有答案,但是我想聽聽大家的見解,謝謝!
- 關於mysql和jsp的中文問題~謝謝MySqlJS
- 請大家幫忙,關於儲存過程分頁的問題...謝謝儲存過程
- 一個關於mysql方面的問題,希望斑竹和大家能幫忙,謝謝!!MySql
- 關於SimpleJdonFrameworkTest的問題,謝謝!Framework
- 函式作為引數傳遞函式
- golang 方法作為引數傳遞Golang
- 關於petstore的執行問題,謝謝~
- c++ -- 二維陣列引數傳遞C++陣列
- 請問這個報錯該怎麼解決,謝謝
- BEANS使用LOOKUP()呼叫的時候返回物件的問題???(先謝謝了)Bean物件
- ajax使用url傳遞中文引數亂碼問題解決
- 安裝jive3.1.5問題,謝謝
- Java後臺接收前端傳遞的陣列物件引數的處理Java前端陣列物件
- Struts +Spring + Hibernate 的配置問題,謝謝!Spring
- 請幫我看看呼叫webservice的問題謝謝!Web
- 高手幫忙解決兩道JAVA題,跪謝!!Java
- java函式陣列引數的複製問題Java函式陣列
- Java 從陣列來看值傳遞和引用傳遞Java陣列
- Java方法04:命令列傳遞引數、可變引數Java命令列
- 在weblogic中配置mysql的連線池的問題??希望大家進來看看了,謝謝了WebMySql
- 有關工作流程的概念,用法的問題!謝謝
- jdbctemplate呼叫儲存過程傳遞陣列引數JDBC儲存過程陣列
- 請教彭老師關於jdbc的問題,謝謝!JDBC
- 請教tomcat連線sqlserver的問題!!謝謝各位!TomcatSQLServer
- jive配置中的database問題?!請幫忙阿謝謝!Database
- Cursor 作為引數傳遞並返回結果
- java 中引數的傳遞Java
- 安裝是遇到錯誤,大家幫我看看,謝謝