final Integer[] arr={1,2,3};
arr[0]=3;
System.out.println(Arrays.toString(arr));
我試過上面的代碼,看看最終的數組變量是否能夠被重新分配[ANS:它可以是]。我明白,最後的整數[]數組這意味着我們不能指派另一Integer []實例除了我們最初指定的實例之外。我想知道是否有可能使數組變量也不可修改。Java的不可修改的陣列
final Integer[] arr={1,2,3};
arr[0]=3;
System.out.println(Arrays.toString(arr));
我試過上面的代碼,看看最終的數組變量是否能夠被重新分配[ANS:它可以是]。我明白,最後的整數[]數組這意味着我們不能指派另一Integer []實例除了我們最初指定的實例之外。我想知道是否有可能使數組變量也不可修改。Java的不可修改的陣列
據我所知,這是不可能的。
然而,有一種方法Collections.unmodifiableList(..),其產生例如不可修改的視圖。一個List<Integer>
。
如果你想保證連不可修改視圖列表的創建者都不能修改底層(可修改)列表,看看Guava's ImmutableList。
這是使用集合而不是數組的另一個好理由。 – 2010-09-17 18:06:43
@SkipHead取決於你正在編程的目標。並非每個Java程序都在某個大型主機上的Java EE容器中運行。 – Martin 2013-04-28 15:49:20
請參閱http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/index.html上的Guava ImmutableList的最新文檔,因爲現在不推薦使用add和addAll方法。 – 2014-03-08 18:25:56
不可以。數組的內容可以更改。你無法阻止這一點。
Collections有多種創建不可修改集合的方法,但不提供數組。
最終關鍵字僅防止改變ARR參考,即不能做到:
final int[] arr={1,2,3};
arr = new int[5];
如果對象ARR是指的是可變對象(如陣列),沒有什麼能夠阻止從修改它。
唯一的解決方案是使用不可變對象。
關鍵字'final'僅適用於引用(指向堆中對象的內存位置的指針)。您不能更改對象的內存地址(位置)。它直到你的對象如何在內部處理不變性。
新增,儘管int是原始數據類型int []應該被視爲一個對象。
你不能做到這一點
final int a = 5
a = 6
你可以這樣做:
final int[] a = new int[]{2,3,4};
a[0] = 6;
你不能做到這一點:
final int[] a = new int[]{2,3,4};
a = new int[]{1,2,3}
爲別人讀這個老問題,請記住,谷歌Guava的不變的集合。 ImmutableList比Collections.unmodifiableList()具有更強的性能,並且可以說更安全,因爲它確實是不可變的,並且不會受到可變集合的支持。
另一種方法是使用此功能:
Arrays.copyOf(arr, arr.length);
使ARR不可修改的唯一途徑是採取它的一個克隆或副本,並使用副本。這樣原件不會被改變。順便說一句:int []在這裏可能是比Integer []更好的選擇。 – 2010-09-17 20:11:44
檢查我的答案在這裏http://stackoverflow.com/a/16545097/326874 – aeracode 2013-05-14 13:53:29