2010-09-17 69 views
10
final Integer[] arr={1,2,3}; 
arr[0]=3; 
System.out.println(Arrays.toString(arr)); 

我試過上面的代碼,看看最終的數組變量是否能夠被重新分配[ANS:它可以是]。我明白,最後的整數[]數組這意味着我們不能指派另一Integer []實例除了我們最初指定的實例之外。我想知道是否有可能使數組變量也不可修改。Java的不可修改的陣列

+2

使ARR不可修改的唯一途徑是採取它的一個克隆或副本,並使用副本。這樣原件不會被改變。順便說一句:int []在這裏可能是比Integer []更好的選擇。 – 2010-09-17 20:11:44

+0

檢查我的答案在這裏http://stackoverflow.com/a/16545097/326874 – aeracode 2013-05-14 13:53:29

回答

18

據我所知,這是不可能的。

然而,有一種方法Collections.unmodifiableList(..),其產生例如不可修改的視圖。一個List<Integer>

如果你想保證連不可修改視圖列表的創建者都不能修改底層(可修改)列表,看看Guava's ImmutableList

+4

這是使用集合而不是數組的另一個好理由。 – 2010-09-17 18:06:43

+2

@SkipHead取決於你正在編程的目標。並非每個Java程序都在某個大型主機上的Java EE容器中運行。 – Martin 2013-04-28 15:49:20

+0

請參閱http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/index.html上的Guava ImmutableList的最新文檔,因爲現在不推薦使用add和addAll方法。 – 2014-03-08 18:25:56

8

不可以。數組的內容可以更改。你無法阻止這一點。

Collections有多種創建不可修改集合的方法,但不提供數組。

4

最終關鍵字僅防止改變ARR參考,即不能做到:

final int[] arr={1,2,3}; 
arr = new int[5]; 

如果對象ARR是指的是可變對象(如陣列),沒有什麼能夠阻止從修改它。

唯一的解決方案是使用不可變對象。

0

關鍵字'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} 
0

爲別人讀這個老問題,請記住,谷歌Guava的不變的集合。 ImmutableList比Collections.unmodifiableList()具有更強的性能,並且可以說更安全,因爲它確實是不可變的,並且不會受到可變集合的支持。

0

另一種方法是使用此功能:

Arrays.copyOf(arr, arr.length);