2012-10-30 26 views
0

爲什麼當我打電話爲什麼我的原始列表陣列是越來越修改

ArrayList<String> reversedList = ListUtils.reverse(list); 

被修改原始名單,即使我做一個副本的方法

package com.javablackbelt.utils; 

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

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); 

     ArrayList<String> reversedList = ListUtils.reverse(list); 
     ListUtils.print(reversedList); 

     String[] arrFromList = ListUtils.toArray(list); 
     ArrayUtils.print(arrFromList); 

    } 

    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()); 
    } 

    public static ArrayList<String> reverse(ArrayList<String> aList) { 
     ArrayList<String> newList = aList; 

     Collections.reverse(newList); 
     return newList; 
    } 

    public static String[] toArray(ArrayList<String> list) { 
     ArrayList<String> newList = list; 
     String[] newStr = newList.toArray(new String[list.size()]); 

     return newStr; 
    } 

} 
+0

,你認爲你正在做一個副本,這是非常不明確。你能爲我們縮小它嗎? –

回答

3

ArrayList<String> newList = aList;內沒有創建一個新的列表。它爲同一個列表創建一個新的參考。

創建一個新的列表可以做到這樣:

ArrayList<String> newList = new ArrayList<String>(aList.size()); 
for (String str : aList) 
    newList.add(str); 

THX @JB Nizet 這簡單得多:

ArrayList<String> newList = new ArrayList<String>(aList); 
+4

或者更簡單一些:'列表 newList = new ArrayList (aList);' –

+0

@JBNizet哦,這樣做的人創建一個新的列表,並將其複製在一行...工作很好 – miatech

+0

是的。所有的集合都有一個這樣的拷貝構造函數,你可以通過閱讀javadoc來發現。 –

0

當你說ArrayList<String> newList = aList;沒有創建一個新的列表,但將newList指向aList。如果您不想修改現有列表,請創建一個新的ArrayList並將aList添加到該newList中。

public static ArrayList<String> reverse(ArrayList<String> aList) { 
      ArrayList<String> newList= new ArrayList<>(); 
        newList.addAll(aList); 

      Collections.reverse(newList); 
      return newList; 
     } 

編輯:

use Collections.copy(List dest, List src) to copy. 

check here for Collections API

+0

是否可以在列表中使用System.arraycopy()?像數組?...我試圖創建一個新的,然後使用arraycopy複製它,但我得到運行時錯誤 – miatech

+0

你正在收到編譯錯誤。數組和列表是不同種類的對象。您無法將列表傳遞給擴展數組的方法。只是kike,你無法將蘋果傳遞給期待Orange的方法。有一點很有用的東西叫做[javadoc](http://download.oracle.com/javase/6/docs/api/),它可以免費獲得,並且公開了JDK中每個類的所有方法,與他們的文件。閱讀。 –

+0

@miatech checkmy編輯 – PermGenError