日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 中的 String 真的是不可变的吗

發布時間:2023/12/3 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 中的 String 真的是不可变的吗 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自? ?Java 中的 String 真的是不可變的嗎

我們都知道 Java 中的 String 類的設計是不可變的,來看下 String 類的源碼。

public?final?class?Stringimplements?java.io.Serializable,?Comparable<String>,?CharSequence?{/**?The?value?is?used?for?character?storage.?*/private?final?char?value[];/**?Cache?the?hash?code?for?the?string?*/private?int?hash;?//?Default?to?0//?... }

可以看出 String 類是 final 類型的,String 不能被繼承。其值 value 也就是對字符數組的封裝,即 char[],其值被定義成 private final 的,說明不能通過外界修改,即不可變。

String 真的 "不可變 " 嗎?

來看下面這個例子。

String?str?=?"Python"; System.out.println(str);?//?Pythonstr?=?"Java"; System.out.println(str);?//?Javastr?=?str.substring(1); System.out.println(str);?//?ava

你有可能會問:str 不是由 Python 變成 Java 了嗎?然后通過 substring 方法變成 ava 了嗎?

這其實是初學者的一個誤區,從上面看 String 的結構可以得知字符串是由字符數組構成的,str 只是一個引用而已,第一次引用了 "Python",后面變成了 "Java",而 substring 也是用 Arrays.copyOfRange 方法重新復制字符數組構造了一個新的字符串。

?

所以說,這里的字符串并不是可變,只是變更了字符串引用。

關于 substring 在 JDK 各個版本的差異可以看這篇文章《注意:字符串substring方法在jkd6,7,8中的差異》,也可以去看 substring 的各個版本的源碼。

String 真的真的真的 "不可變 " 嗎?

上面的例子肯定是不可變的,下面這個就尷尬了。

String?str?=?"Hello?Python"; System.out.println(str);?//?Hello?PythonField?field?=?String.class.getDeclaredField("value"); field.setAccessible(true);char[]?value?=?(char[])field.get(str); value[6]?=?'J'; value[7]?=?'a'; value[8]?=?'v'; value[9]?=?'a'; value[10]?=?'!'; value[11]?=?'!'; System.out.println(str);?//?Hello?Java!!

通過反射,我們改變了底層的字符數組的值,實現了字符串的 “不可變” 性,這是一種騷操作,不建議這么使用,違反了 Java 對 String 類的不可變設計原則,會造成一些安全問題。

總結

以上是生活随笔為你收集整理的Java 中的 String 真的是不可变的吗的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。