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是沒有變化的,哎,寫到這裡,有想到了自己可憐的基礎知識了,還是需要慢慢積累吧,加油!
相關文章
- 將函式作為引數傳遞解決非同步問題函式非同步
- 二維陣列作為引數傳遞問題陣列
- 引數為*&與*的區別以及二維陣列傳遞時列數不對等的區別陣列
- 測試問題思考,有些問題我自己有答案,但是我想聽聽大家的見解,謝謝!
- Shell自學二(引數傳遞和陣列)陣列
- 函式作為引數傳遞函式
- 請問這個報錯該怎麼解決,謝謝
- c++ -- 二維陣列引數傳遞C++陣列
- Java後臺接收前端傳遞的陣列物件引數的處理Java前端陣列物件
- String和StringBuffer型別資料進行引數傳遞問題型別
- Java 從陣列來看值傳遞和引用傳遞Java陣列
- Java中將方法作為引數傳遞5種方式Java
- Java方法04:命令列傳遞引數、可變引數Java命令列
- Js傳遞陣列引數到後臺controller的方式JS陣列Controller
- vue 新增axios解決post傳引數為null問題VueiOSNull
- @Component和@Configuration作為配置類的差別
- 【java】【集合】陣列和集合的基本概述Java陣列
- 引數的定義和引數的傳遞
- 二級指標,二維陣列函式引數傳遞指標陣列函式
- C語言函式傳遞指標引數的問題詳解C語言函式指標
- Go中slice作為引數傳遞的一些“坑”Go
- Golang 切片作為函式引數傳遞的陷阱與解答Golang函式
- 解決MongoDB儲存時間時差的問題MongoDB
- java 傳遞引數的兩種方式Java
- Mybatis動態傳入order by 引數的時候不生效的問題解決方案MyBatis
- Day18--命令列傳遞引數命令列
- Github | Rust整理資料,分享給大家,多謝大家的支援GithubRust
- offer 比較,人生十字路口大家幫幫忙 謝謝
- 請問下後臺附件上傳提示沒有上傳的檔案是什麼原因呢? 謝謝
- JAVA基礎之-引數傳遞Java
- MyBatis中傳入引數為List集合的MyBatis
- PHP 面試遇到的問題,後期會不定期更新一下,大家也可以把認為經典的問題評論留言,感謝大家!PHP面試
- Python抽象基類:ABC謝謝你,因為有你,溫暖了四季!Python抽象
- 解決CORS跨域不能傳遞cookies的問題CORS跨域Cookie
- 這一次,徹底解決Java的值傳遞和引用傳遞Java
- 引數傳遞
- post傳引數,但是後端無法接收問題解決後端
- 謝謝,一年
- php url傳遞陣列PHP陣列