91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java final的不可變性是什么意思

發布時間:2021-08-24 11:22:47 來源:億速云 閱讀:152 作者:chen 欄目:開發技術

本篇內容介紹了“java final的不可變性是什么意思”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

目錄
  • 一、java final基本概念:

    • 1、主要用于修飾類、屬性和方法:

    • 2、final finally finalize區別:

  • 二、final 不可變:

    •  1、JAVA String類 為什么是final 不可變的?

    • 2、String的不可變性:

一、java final基本概念:

1、主要用于修飾類、屬性和方法:

被final修飾的類不可以被繼承
被final修飾的方法不可以被重寫
被final修飾的變量不可以被改變,被final修飾不可變的是變量的引用,而不是引用指向的內容,引用指向的內容是可以改變的

2、final finally finalize區別:

(1)final:可以修飾類、變量、方法,修飾類表示該類不能被繼承、修飾方法表示該方法不能被重寫、修飾變量表
示該變量是一個常量不能被重新賦值。
(2)finally:一般作用在try-catch代碼塊中,在處理異常的時候,通常我們將一定要執行的代碼方法finally代碼塊
中,表示不管是否出現異常,該代碼塊都會執行,一般用來存放一些關閉資源的代碼。
(3)finalize:是一個方法,屬于Object類的一個方法,而Object類是所有類的父類,該方法一般由垃圾回收器來調
用,當我們調用System.gc() 方法的時候,由垃圾回收器調用finalize(),回收垃圾,一個對象是否可回收的

二、final 不可變:

 1、JAVA String類 為什么是final 不可變的?

(1)為了線程安全:

(2)為了實現字符串池:

字符串池: java中的字符串池是存儲在Java堆內存中的字符串池;
簡單來說,字符串池就是相當于一個公用相冊,需要的時候從公用相冊里面去查找,如果有就直接使用,如果沒有就添加一張進去,這樣自己和其他人就可以使用了

(3)為了實現String可以創建HashCode不可變性:

先看下string類的源碼,被final修飾,final修飾的char[]代表了被存儲的數據不可更改性,源碼如下:

java final的不可變性是什么意思

a. String為什么要被final修飾:

主要是為了安全性和效率;

b. final修飾的String:

代表了String的不可繼承性,final修飾的char[]代表了被存儲的數據不可更改性。但是:雖然final代表了不可變,但僅僅是引用地址不可變,并不代表了數組本身不會變

c. final修改例子分析:

java final的不可變性是什么意思

在例1中,我們用final修飾了一個集合list,并對集合進行add()操作,執行成功。
在例2中,我們對集合進行變更,執行失敗;

d. 原因分析:

final修飾的集合‘list'是一個引用,而這個引用指向了‘list',在往集合里添加數據的時候,并沒有影響到‘stringList'引用地址。而當我們 list = new ArrayList<>(); 為什么就不可以了呢? 因為這就相當于修改引用地址,是不可以的。final的意思是地址不能改,但是地址指向的內容當然可以改
數組是私有方法,所以起作用的還有private,正是因為兩者保證了String的不可變性。

e. 只有當字符串是不可變的,字符串池才有可能實現:

一個緩存區,如果字符串可變,如果在其它地方也有引用,指向的引用發生了變更,會發生混亂;
字符串池的實現可以在運行時節約很多heap空間,因為不同的字符串變量都指向池中的同一個字符串。但如果字符串是可變的,那么String interning將不能實現,因為這樣的話,如果變量改變了它的值,那么其它指向這個值的變量的值也會一起改變

f. hashcode不可變性

因為字符串是不可變的,所以在它創建的時候HashCode就被緩存了,不需要重新計算。這就使得字符串很適合作為Map中的鍵,字符串的處理速度要快過其它的鍵對象。這就是HashMap中的鍵往往都使用字符串

java final的不可變性是什么意思

得出來的HashCode是一樣的,但是為什么得出來的地址不一樣
因為直接定義的String m = “a”; 是儲存在常量存儲區中的字符串常量池中;而new String(“a”)是存儲在堆中,所以地址不一樣

2、String的不可變性:

(1)為什么需要保證String不可變

因為只有當字符串是不可變的,字符串池才有可能實現。字符串池的實現可以在運行時節約很多heap空間,因為不同的字符串變量都指向池中的同一個字符串。但如果字符串是可變的,那么String interning將不能實現,因為這樣的話,如果變量改變了它的值,那么其它指向這個值的變量的值也會一起改變。

(2)如果字符串是可變的,那么會引起很嚴重的安全問題

比如,數據庫的用戶名、密碼都是以字符串的形式傳入來獲得數據庫的連接,或者在socket編程中,主機名和端口都是以字符串的形式傳入。因為字符串是不可變的,所以它的值是不可改變的,否則黑客們可以鉆到空子,改變字符串指向的對象的值,造成安全漏洞。

(3)因為字符串是不可變的,所以是多線程安全的

同一個字符串實例可以被多個線程共享,這樣便不用因為線程安全問題而使用同步,字符串自己便是線程安全的。

(4)因為字符串是不可變的,所以在它創建的時候HashCode就被緩存了,不需要重新計算。

這就使得字符串很適合作為Map中的鍵,字符串的處理速度要快過其它的鍵對象,這就是HashMap中的鍵往往都使用字符串

“java final的不可變性是什么意思”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

眉山市| 长兴县| 申扎县| 扎赉特旗| 澎湖县| 周宁县| 固原市| 纳雍县| 新沂市| 和田市| 陈巴尔虎旗| 都昌县| 稻城县| 青河县| 扎鲁特旗| 连城县| 桐柏县| 石嘴山市| 延边| 海南省| 那坡县| 株洲县| 绥宁县| 遂昌县| 漠河县| 高邑县| 西吉县| 湘乡市| 阿合奇县| 云安县| 海宁市| 武强县| 南部县| 盖州市| 隆回县| 乌苏市| 克东县| 察雅县| 温泉县| 浮山县| 韶关市|