亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java的string類為什么是不可變的

2019-11-26 15:32:26
字體:
來源:轉載
供稿:網友

答案一:

最流行的Java面試題之一就是:什么是不可變對象(immutable object),不可變對象有什么好處,在什么情況下應該用,或者更具體一些,Java的String類為什么要設成immutable類型?
不可變對象,顧名思義就是創建后不可以改變的對象,典型的例子就是Java中的String類。

復制代碼 代碼如下:

String s = "ABC"; 
s.toLowerCase();

如上s.toLowerCase()并沒有改變“ABC“的值,而是創建了一個新的String類“abc”,然后將新的實例的指向變量s。
相對于可變對象,不可變對象有很多優勢:
1).不可變對象可以提高String Pool的效率和安全性。如果你知道一個對象是不可變的,那么需要拷貝這個對象的內容時,就不用復制它的本身而只是復制它的地址,復制地址(通常一個指針的大?。┬枰苄〉膬却嫘室埠芨摺τ谕瑫r引用這個“ABC”的其他變量也不會造成影響。
2).不可變對象對于多線程是安全的,因為在多線程同時進行的情況下,一個可變對象的值很可能被其他進程改變,這樣會造成不可預期的結果,而使用不可變對象就可以避免這種情況。
當然也有其他方面原因,但是Java把String設成immutable最大的原因應該是效率和安全。


答案二:

這是一個老生常談的話題(This is an old yet still popular question). 在Java中將String設計成不可變的是綜合考慮到各種因素的結果,想要理解這個問題,需要綜合內存,同步,數據結構以及安全等方面的考慮. 在下文中,我將為各種原因做一個小結。

1. 字符串常量池的需要

字符串常量池(String pool, String intern pool, String保留池) 是Java堆內存中一個特殊的存儲區域, 當創建一個String對象時,假如此字符串值已經存在于常量池中,則不會創建一個新的對象,而是引用已經存在的對象。
如下面的代碼所示,將會在堆內存中只創建一個實際String對象.

復制代碼 代碼如下:

String s1 = "abcd"; 
String s2 = "abcd"; 

示意圖如下所示:

 

假若字符串對象允許改變,那么將會導致各種邏輯錯誤,比如改變一個對象會影響到另一個獨立對象. 嚴格來說,這種常量池的思想,是一種優化手段.

請思考: 假若代碼如下所示,s1和s2還會指向同一個實際的String對象嗎?

復制代碼 代碼如下:

String s1= "ab" + "cd"; 
String s2= "abc" + "d"; 

也許這個問題違反新手的直覺, 但是考慮到現代編譯器會進行常規的優化, 所以他們都會指向常量池中的同一個對象. 或者,你可以用 jd-gui 之類的工具查看一下編譯后的class文件.

2. 允許String對象緩存HashCode

Java中String對象的哈希碼被頻繁地使用, 比如在hashMap 等容器中。

字符串不變性保證了hash碼的唯一性,因此可以放心地進行緩存.這也是一種性能優化手段,意味著不必每次都去計算新的哈希碼. 在String類的定義中有如下代碼:

復制代碼 代碼如下:

private int hash;//用來緩存HashCode 

3. 安全性

String被許多的Java類(庫)用來當做參數,例如 網絡連接地址URL,文件路徑path,還有反射機制所需要的String參數等, 假若String不是固定不變的,將會引起各種安全隱患。
假如有如下的代碼:

復制代碼 代碼如下:

boolean connect(string s){
    if (!isSecure(s)) {
throw new SecurityException();
}
    // 如果在其他地方可以修改String,那么此處就會引起各種預料不到的問題/錯誤
    causeProblem(s);
}

總體來說, String不可變的原因包括 設計考慮,效率優化問題,以及安全性這三大方面. 事實上,這也是Java面試中的許多 "為什么" 的答案。


答案三:String類不可變性的好處

String是所有語言中最常用的一個類。我們知道在Java中,String是不可變的、final的。Java在運行時也保存了一個字符串池(String pool),這使得String成為了一個特別的類。

String類不可變性的好處

1.只有當字符串是不可變的,字符串池才有可能實現。字符串池的實現可以在運行時節約很多heap空間,因為不同的字符串變量都指向池中的同一個字符串。但如果字符串是可變的,那么String interning將不能實現(譯者注:String interning是指對不同的字符串僅僅只保存一個,即不會保存多個相同的字符串。),因為這樣的話,如果變量改變了它的值,那么其它指向這個值的變量的值也會一起改變。
2.如果字符串是可變的,那么會引起很嚴重的安全問題。譬如,數據庫的用戶名、密碼都是以字符串的形式傳入來獲得數據庫的連接,或者在socket編程中,主機名和端口都是以字符串的形式傳入。因為字符串是不可變的,所以它的值是不可改變的,否則黑客們可以鉆到空子,改變字符串指向的對象的值,造成安全漏洞。
3.因為字符串是不可變的,所以是多線程安全的,同一個字符串實例可以被多個線程共享。這樣便不用因為線程安全問題而使用同步。字符串自己便是線程安全的。
4.類加載器要用到字符串,不可變性提供了安全性,以便正確的類被加載。譬如你想加載java.sql.Connection類,而這個值被改成了myhacked.Connection,那么會對你的數據庫造成不可知的破壞。
5.因為字符串是不可變的,所以在它創建的時候hashcode就被緩存了,不需要重新計算。這就使得字符串很適合作為Map中的鍵,字符串的處理速度要快過其它的鍵對象。這就是HashMap中的鍵往往都使用字符串。
以上就是我總結的字符串不可變性的好處。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产69久久精品成人| 欧美国产日产韩国视频| 日本高清视频一区| 亚洲va码欧洲m码| 日本欧美一二三区| 青青草精品毛片| 国产精品女人久久久久久| 亚洲国产成人精品久久久国产成人一区| 国产成人精品免费视频| 久久免费视频观看| 国产在线视频2019最新视频| 在线看日韩欧美| 午夜精品久久久99热福利| 国产精品久久久久久久久久久新郎| 国产第一区电影| 色偷偷av一区二区三区乱| 秋霞av国产精品一区| 欧美日韩亚洲一区二| 永久免费毛片在线播放不卡| 欧美亚洲国产日韩2020| 91成品人片a无限观看| 中文日韩在线视频| 亚洲精品wwww| 亚洲r级在线观看| 国产亚洲一区二区在线| 国产在线观看精品一区二区三区| 亚洲精品网站在线播放gif| 久久久精品亚洲| 伦伦影院午夜日韩欧美限制| 亚洲free性xxxx护士白浆| 欧美猛交ⅹxxx乱大交视频| 亚洲欧美制服第一页| 亚洲国语精品自产拍在线观看| 亚洲精品网址在线观看| 91精品国产91久久久久久久久| 欧美大片va欧美在线播放| 91色视频在线观看| 日韩免费av在线| 亚洲国产欧美一区二区丝袜黑人| 精品久久久久人成| 国产午夜精品一区二区三区| 欧美综合第一页| 久久精品国产电影| 欧美激情极品视频| 久久久国产影院| 久久天天躁夜夜躁狠狠躁2022| 国产91|九色| 亚洲美女av黄| 国产精品久久久av| 亚洲成人黄色在线| 欧美极品欧美精品欧美视频| 中文字幕日韩欧美精品在线观看| 欧美富婆性猛交| 亚洲最大成人在线| 午夜精品久久久99热福利| 97久久精品在线| 岛国av一区二区三区| 久久国产精品久久国产精品| 亚洲免费影视第一页| 国产精品69久久| 久久韩国免费视频| 91成人在线观看国产| 亚洲免费中文字幕| 欧美一区二区三区图| 久久久亚洲精品视频| 亚洲成人av在线| 最近2019中文字幕mv免费看| 国产精品久久久av| 精品久久久久久久久中文字幕| 亚洲视频电影图片偷拍一区| 日本精品一区二区三区在线| 亚洲区中文字幕| 国产xxx69麻豆国语对白| 国产玖玖精品视频| 亚洲综合av影视| 日日骚久久av| 国产精品91视频| 97在线看免费观看视频在线观看| 欧美夫妻性生活xx| 国产一区二区在线播放| 日本久久久a级免费| 亚洲黄在线观看| 久久全国免费视频| 亚洲综合第一页| 亚洲精品国产品国语在线| 久久青草福利网站| 国产精品ⅴa在线观看h| 这里只有精品久久| 欧美成aaa人片在线观看蜜臀| 久久手机免费视频| 91国产在线精品| 精品视频久久久久久久| 黄色精品在线看| 成人黄色短视频在线观看| 欧美日韩国产精品一区| 国产999视频| 亚洲国产精品成人精品| 国产成人啪精品视频免费网| 色噜噜狠狠色综合网图区| 欧美极品少妇xxxxⅹ免费视频| 久久久久久国产精品三级玉女聊斋| 日韩成人在线播放| 91精品国产综合久久男男| 日韩欧美在线播放| 57pao精品| 岛国av一区二区在线在线观看| 永久555www成人免费| 亚洲自拍小视频免费观看| 91久久久国产精品| 国产高清视频一区三区| 欧美成人三级视频网站| 欧美激情手机在线视频| 国产精品视频在线播放| 精品久久久香蕉免费精品视频| 亚洲欧美一区二区三区久久| 在线观看中文字幕亚洲| 欧美天堂在线观看| 2018中文字幕一区二区三区| 精品高清美女精品国产区| 6080yy精品一区二区三区| 亚洲美女在线观看| 久久青草精品视频免费观看| 亚洲少妇中文在线| 国产视频在线一区二区| 亚洲一级免费视频| 日韩精品有码在线观看| 久久亚洲春色中文字幕| 欧美区二区三区| 亚洲无线码在线一区观看| 成人免费视频在线观看超级碰| 中文字幕成人精品久久不卡| 亚洲一区二区三区sesese| 亚洲人成在线观| 欧美午夜无遮挡| 欧美日韩国内自拍| 亚洲精品在线看| 久久视频在线播放| 亚洲激情成人网| 欧美国产亚洲精品久久久8v| 在线精品播放av| 亚洲aaaaaa| 9.1国产丝袜在线观看| 啪一啪鲁一鲁2019在线视频| 亚洲图片欧洲图片av| 国产日韩欧美另类| 欧美性猛交xxxx免费看久久久| 久久久久久国产精品| 亚洲第一精品久久忘忧草社区| 国产精品入口福利| 日韩在线观看免费| 精品一区二区三区三区| 亚洲精品日产aⅴ| 欧美精品videossex性护士| 最近中文字幕日韩精品| 亚洲视频一区二区| 国产精品羞羞答答| 日韩欧美成人网| 久久久久久久久久久91| 国内精品小视频在线观看| 伊人伊人伊人久久| 日本精品一区二区三区在线播放视频| 91国产视频在线| 欧美精品在线播放| 亚洲色图校园春色|