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

分析Java中為什么String不可變

 更新時間:2021年06月07日 08:51:42   作者:煙花散盡13141  
Java中為什么String是不可變性的。今天我們從多角度解析為什么Java把String做成不可變的。

常量池

Java中我們創(chuàng)建String對象有兩種基本方法。

String str1 = "zxhtom";
String str2 = new String("zxhtom");

上面兩種方式我們創(chuàng)建了兩個String變量 。 但是第一種通過雙引號創(chuàng)建的zxhtom這個對象我們稱之為常量 。 在JVM中是存儲在一塊叫【常量池】中的。而第二種str2是我們稱之為普通變量。new一次就在JVM中開辟一塊內(nèi)存。

【常量池】的作用就是復(fù)用,當(dāng)同樣的內(nèi)容再次被通過常量方式創(chuàng)建的時候Java會指向同一塊地址。通過如下代碼理解:

String z1 = "zxhtom";
String z2 = "zxhtom";

通過上圖我們可以了解 z1 , z2兩個變量其實引用的是同一內(nèi)存地址 。 所以z1==z2 為true .

到這里引發(fā)出為什么String被設(shè)計為不可變 。 上列中z1 被修改成zxh . 如果String是可變得那么z2就會被莫名其妙修改成zxh .

便利

在Java中判斷兩個對象相等時通過地址判斷。但是地址被抽象話為一段hash函數(shù)。在Java使用中hash是經(jīng)常被使用的。將String設(shè)置為不可變性那么hash就可以一直使用下去。不需要重新計算體現(xiàn)了便捷性

安全

仍是上面的情況 , z2會被不知情的情況下被修改了。這在多線程中很常見。我們在使用的時候會被其他情況將數(shù)據(jù)更改。這樣我們的數(shù)據(jù)將會失去了準(zhǔn)確性。

引申問題

在上部中我們提到String的常量池。針對常量池引發(fā)思考 【String.intern()】

該方法的功能就是擴(kuò)充【常量池】。z2.intern() 表示判斷常量池中是否存在與該值相同的對象如果有則返回該對象的引用。 如果沒有則將該值注冊到內(nèi)存中。注意這里并不是將z2對象注冊過去。而是將z2的值注冊進(jìn)去。

String z1=new String("zxhtom");
String z2=z1.intern();
System.out.println( z1==z1.intern() );
System.out.println( z1.hashCode()+" "+z2.hashCode() );
System.out.println( z2==z1 );
System.out.println( z2==z1.intern() );

輸出結(jié)構(gòu)

false

-688175064 -688175064

false

true

分析一下輸出結(jié)果不難發(fā)現(xiàn),z1.intern()是常量池中沒有zxhtom,會將zxhtom值創(chuàng)建到常量池中,z2就是引用常量池中的引用。這個時候z1==z2 為false說明注冊到常量池中的并不是z1的地址,而是相當(dāng)于z1的一個對象拷貝。

string創(chuàng)建方式的確定簡單歸結(jié):

  • 通過雙引號創(chuàng)建的 == 常量創(chuàng)建
  • 通過常量拼接 == 常量創(chuàng)建
  • 通過非常量與常量拼接 = 非常量創(chuàng)建
  • 通過new 創(chuàng)建 == 非常量創(chuàng)建

String在Java中的【引用傳遞】

在Java中方法參數(shù)傳遞都是通過值傳遞的。但是為什么String給我們的感覺是引用傳遞的呢?

public static void main(String[] args) {
	String x = new String("ab");
	change(x);
	System.out.println(x);
}
 
public static void change(String x) {
	x = "cd";
}

String不是基本對象所以String是引用傳遞。但是這里的引用傳遞知識傳遞String引用的地址 .當(dāng)執(zhí)行x=cd是原來ab的對象還在JVM中。外部x的引用地址沒有變 。 變得知識change方法中x的指向。所以外部打印的還是ab

以上就是分析Java中為什么String不可變的詳細(xì)內(nèi)容,更多關(guān)于Java中為什么String不可變的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

麻城市| 深水埗区| 泉州市| 乐平市| 乌拉特前旗| 天峨县| 安庆市| 资阳市| 旌德县| 炎陵县| 双桥区| 理塘县| 铁力市| 蒙山县| 平湖市| 高阳县| 延边| 璧山县| 兴化市| 湘西| 徐州市| 磐石市| 和平区| 桓台县| 石渠县| 信丰县| 文昌市| 兰坪| 旬阳县| 祁连县| 盐亭县| 灵宝市| 松江区| 化州市| 庆云县| 友谊县| 定安县| 铅山县| 喀什市| 潜山县| 绍兴市|