簡體   English   中英

為什么Java最終數組變量可以修改?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM