最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入理解java final不可變性

 更新時(shí)間:2021年08月24日 08:31:20   作者:業(yè)余敲代碼  
本文主要介紹了講講java final不可變性,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、java final基本概念:

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

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

2、final finally finalize區(qū)別:

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

二、final 不可變:

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

(1)為了線程安全:

(2)為了實(shí)現(xiàn)字符串池:

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

(3)為了實(shí)現(xiàn)String可以創(chuàng)建HashCode不可變性:

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

在這里插入圖片描述

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

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

b. final修飾的String:

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

c. final修改例子分析:

在這里插入圖片描述

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

d. 原因分析:

final修飾的集合‘list'是一個(gè)引用,而這個(gè)引用指向了‘list',在往集合里添加數(shù)據(jù)的時(shí)候,并沒有影響到‘stringList'引用地址。而當(dāng)我們 list = new ArrayList<>(); 為什么就不可以了呢? 因?yàn)檫@就相當(dāng)于修改引用地址,是不可以的。final的意思是地址不能改,但是地址指向的內(nèi)容當(dāng)然可以改
數(shù)組是私有方法,所以起作用的還有private,正是因?yàn)閮烧弑WC了String的不可變性。

e. 只有當(dāng)字符串是不可變的,字符串池才有可能實(shí)現(xiàn):

一個(gè)緩存區(qū),如果字符串可變,如果在其它地方也有引用,指向的引用發(fā)生了變更,會(huì)發(fā)生混亂;
字符串池的實(shí)現(xiàn)可以在運(yùn)行時(shí)節(jié)約很多heap空間,因?yàn)椴煌淖址兞慷贾赶虺刂械耐粋€(gè)字符串。但如果字符串是可變的,那么String interning將不能實(shí)現(xiàn),因?yàn)檫@樣的話,如果變量改變了它的值,那么其它指向這個(gè)值的變量的值也會(huì)一起改變

f. hashcode不可變性

因?yàn)樽址遣豢勺兊?,所以在它?chuàng)建的時(shí)候HashCode就被緩存了,不需要重新計(jì)算。這就使得字符串很適合作為Map中的鍵,字符串的處理速度要快過其它的鍵對象。這就是HashMap中的鍵往往都使用字符串

在這里插入圖片描述

得出來的HashCode是一樣的,但是為什么得出來的地址不一樣
因?yàn)橹苯佣x的String m = “a”; 是儲(chǔ)存在常量存儲(chǔ)區(qū)中的字符串常量池中;而new String(“a”)是存儲(chǔ)在堆中,所以地址不一樣

2、String的不可變性:

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

因?yàn)橹挥挟?dāng)字符串是不可變的,字符串池才有可能實(shí)現(xiàn)。字符串池的實(shí)現(xiàn)可以在運(yùn)行時(shí)節(jié)約很多heap空間,因?yàn)椴煌淖址兞慷贾赶虺刂械耐粋€(gè)字符串。但如果字符串是可變的,那么String interning將不能實(shí)現(xiàn),因?yàn)檫@樣的話,如果變量改變了它的值,那么其它指向這個(gè)值的變量的值也會(huì)一起改變。

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

比如,數(shù)據(jù)庫的用戶名、密碼都是以字符串的形式傳入來獲得數(shù)據(jù)庫的連接,或者在socket編程中,主機(jī)名和端口都是以字符串的形式傳入。因?yàn)樽址遣豢勺兊?,所以它的值是不可改變的,否則黑客們可以鉆到空子,改變字符串指向的對象的值,造成安全漏洞。

(3)因?yàn)樽址遣豢勺兊模允嵌嗑€程安全的

同一個(gè)字符串實(shí)例可以被多個(gè)線程共享,這樣便不用因?yàn)榫€程安全問題而使用同步,字符串自己便是線程安全的。

(4)因?yàn)樽址遣豢勺兊?,所以在它?chuàng)建的時(shí)候HashCode就被緩存了,不需要重新計(jì)算。

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

到此這篇關(guān)于講講java final不可變性的文章就介紹到這了,更多相關(guān)java final不可變性 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解Java設(shè)計(jì)模式之單例模式

    詳解Java設(shè)計(jì)模式之單例模式

    單例模式是一種創(chuàng)建型設(shè)計(jì)模式,它的目的是確保一個(gè)類只有一個(gè)實(shí)例,并提供一個(gè)全局訪問點(diǎn)來訪問該實(shí)例,在單例模式中,類自身負(fù)責(zé)創(chuàng)建自己的唯一實(shí)例,并確保在系統(tǒng)中只有一個(gè)實(shí)例存在,本文詳細(xì)介紹了Java設(shè)計(jì)模式中的單例模式,感興趣的同學(xué)可以參考閱讀
    2023-05-05
  • Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼

    Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼

    本篇文章主要介紹了Java使用強(qiáng)大的Elastisearch搜索引擎實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-05-05
  • 淺談mybatis如何半自動(dòng)化解耦(推薦)

    淺談mybatis如何半自動(dòng)化解耦(推薦)

    這篇文章主要介紹了淺談mybatis如何半自動(dòng)化解耦,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • SpringBoot中將@Bean方法解析為BeanDefinition詳解

    SpringBoot中將@Bean方法解析為BeanDefinition詳解

    這篇文章主要介紹了SpringBoot中將@Bean方法解析為BeanDefinition詳解,得到的BeanDefinition是ConfigurationClassBeanDefinition類型,會(huì)為BeanDefinition設(shè)置factoryMethodName,這意味著當(dāng)實(shí)例化這個(gè)bean的時(shí)候?qū)⒉捎霉S方法,需要的朋友可以參考下
    2023-12-12
  • JVM執(zhí)行引擎和垃圾回收要點(diǎn)總結(jié)

    JVM執(zhí)行引擎和垃圾回收要點(diǎn)總結(jié)

    不論是在問題現(xiàn)場還是跳槽面試,我們面對JVM性能問題,依舊會(huì)束手無辭,它需要你對Java虛擬機(jī)的實(shí)現(xiàn)和優(yōu)化,有極為深刻的理解。所以我在這里整理了一下 JVM的知識(shí)點(diǎn)。今天說說虛擬機(jī)執(zhí)行引擎和垃圾回收,都是十足的干貨,請各位看官耐心批閱!
    2021-06-06
  • EJB基礎(chǔ)知識(shí)(入門必看)

    EJB基礎(chǔ)知識(shí)(入門必看)

    下面小編就為大家?guī)硪黄狤JB基礎(chǔ)知識(shí)(入門必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java Socket上的Read操作阻塞問題詳解

    Java Socket上的Read操作阻塞問題詳解

    這篇文章主要介紹了Java Socket上的Read操作阻塞問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • java使用jacob.jar將word轉(zhuǎn)pdf

    java使用jacob.jar將word轉(zhuǎn)pdf

    這篇文章主要為大家詳細(xì)介紹了java利用jacob.jar將word轉(zhuǎn)pdf,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 詳解Spring整合mybatis--Spring中的事務(wù)管理(xml形式)

    詳解Spring整合mybatis--Spring中的事務(wù)管理(xml形式)

    這篇文章主要介紹了Spring整合mybatis--Spring中的事務(wù)管理(xml形式),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-11-11
  • Spring mvc Json處理實(shí)現(xiàn)流程代碼實(shí)例

    Spring mvc Json處理實(shí)現(xiàn)流程代碼實(shí)例

    這篇文章主要介紹了Spring mvc Json處理實(shí)現(xiàn)流程代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評論

河津市| 阿勒泰市| 都兰县| 昂仁县| 平泉县| 吉林省| 墨竹工卡县| 青河县| 小金县| 达拉特旗| 江都市| 岗巴县| 灌南县| 宝兴县| 蛟河市| 庐江县| 炎陵县| 安西县| 宝应县| 淮北市| 松潘县| 电白县| 五家渠市| 麻城市| 大邑县| 称多县| 博白县| 从江县| 余庆县| 长垣县| 开平市| 潍坊市| 海林市| 汽车| 台东市| 吉林省| 普格县| 大港区| 昭平县| 葵青区| 康保县|