[英]Why can Java final array variable be modified?
我知道在Java 8中寫一個lambda來使用變量需要final類型,但是為什么可以修改final數組類型的變量呢?
public static void main(String[] args) {
final String[] prefix = {"prefix_"};
String suffix = "_suffix";
List<Integer> list = Arrays.asList(1005, 1006, 1007, 1009);
List<String> flagList = list.stream().map(param -> {
prefix[0] = "NoPrefix_";
String flag = prefix[0] + param + suffix;
return flag;
}).collect(Collectors.toList());
System.out.println(flagList);
System.out.println(prefix[0]);
}
結果:
[NoPrefix_1005_suffix, NoPrefix_1006_suffix, NoPrefix_1007_suffix, NoPrefix_1009_suffix]
NoPrefix_
為什么可以修改最終數組類型的變量?
它不能,即使它看起來可以。
聲明如下,它將“前綴”定義為一個數組:
final String[] prefix
首先,編輯代碼以在聲明之后包含兩個 println() 調用,如下所示:
final String[] prefix = {"prefix_"};
System.out.println("prefix: " + prefix);
System.out.println(prefix[0]);
最后,在已有的 println() 旁邊添加第二個 println(),如下所示:
System.out.println("prefix: " + prefix);
System.out.println(prefix[0]);
如果您運行該代碼,您會看到打印prefix
時的 object hashCode每次都將是相同的 object。 然后改變的不是“前綴”引用的東西——它保持不變,它是和以前一樣的數組。 相反,您所做的是更改數組內部的某些內容,這與數組本身不同。
以下是本地運行的相關行,顯示 object 參考保持不變,但“prefix[0]”的值發生了變化:
prefix: [Ljava.lang.String;@5ca881b5
prefix_
prefix: [Ljava.lang.String;@5ca881b5
NoPrefix_
如果我們嘗試為“prefix”分配一個全新的數組,那么編譯器將顯示一個錯誤——它知道“prefix”被定義為final。
prefix = new String[]{"new"};
cannot assign a value to final variable prefix
如果您正在尋找一種防止更改數據的方法,並且可以使用 List(而不是數組),則可以使用Collections.unmodifiableList() :
返回指定列表的不可修改視圖。 對返回列表的查詢操作“通讀”到指定列表,並嘗試修改返回的列表,無論是直接還是通過其迭代器,都會導致 UnsupportedOperationException。
所以最終數組意味着數組變量實際上是對 object 的引用,不能更改為引用其他任何內容,但可以修改數組的成員
請參閱下面的鏈接以獲取更多信息。 https://www.geeksforgeeks.org/final-arrays-in-java/
例如根據描述
final String[] arr = new String[10];
list.stream().map(ele -> {
arr[0] = ele.getName(); // this will work as you are updating member of array
arr = new String[5]; // this will not work as you are changing whole array object instead of changing member of array object.
}).collect(Collectors.toList());
當您在那里使用任何最終集合時,也會發生同樣的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.