java基礎——String

特性

不可變類:所謂的不可變類是指這個類的實例一旦創(chuàng)建完成后,就不能改變其成員變量值堰塌。以下幾點保證了String的不可變性:

  • String類被final修飾湃望,不可繼承
  • 內(nèi)部所有成員都設置為私有變量且不存在value的set方法
  • 獲取value時不是直接返回對象引用,而是返回對象的copy

成員變量

private final char value[];
private final int offset;
private final int count;

其中炸卑,value存放具體字符串,offset表示偏移量煤傍,count表示char的數(shù)量矾兜。同時注意到,三者均為final修飾患久,根據(jù)java中final的要求所修飾變量要么在聲明時候初始化椅寺,要么在構(gòu)造函數(shù)中初始化浑槽。

常量池

jvm虛擬機為每個被裝載的類型維護一個常量池。常量池就是該類型所用到常量的一個有序集合返帕,包括直接常量(string,integer和 floating point常量)和對其他類型桐玻,字段和方法的符號引用。

對于String常量荆萤,它的值是在常量池中的镊靴。而JVM中的常量池在內(nèi)存當中是以表的形式存在的, 對于String類型链韭,有一張固定長度CONSTANT_String_info表用來存儲文字字符串值偏竟,注意:該表只存儲文字字符串值,不存儲符號引用敞峭。常量池中保存著很多String對象; 并且可以被共享使用踊谋,因此它提高了效率。
字符串常量池優(yōu)勢:

  • 節(jié)省內(nèi)存空間:常量池中所有相同的字符串常量被合并旋讹,只占用一個空間殖蚕。
  • 節(jié)省運行時間:比較字符串時,==比equals()快沉迹。對于兩個引用變量睦疫,只用==判斷引用是否相等,也就可以判斷實際值是否相等鞭呕。
    分析如下代碼:
// str1指向在常量池中生成一個字符串123
String str1 = "123";
// str2通過new的形式指向了堆中生成的字符串蛤育,常量池中已經(jīng)有123
String str2 = new String("123");
// str3在常量池和堆中各生成一個字符串,自身指向堆中數(shù)據(jù)
String str3 = new String("456");

常見問題

String s1 = new String(“xyz”); 創(chuàng)建了幾個對象?

  • 類加載對一個類只會進行一次葫松⊥吒猓”xyz”在類加載時就已經(jīng)創(chuàng)建并駐留了(如果該類被加載之前已經(jīng)有”xyz”字符串被駐留過則不需要重復創(chuàng)建用于駐留的”xyz”實例)。駐留的字符串是放在全局共享的字符串常量池中的进宝。
  • 在這段代碼后續(xù)被運行的時候,”xyz”字面量對應的String實例已經(jīng)固定了枷恕,不會再被重復創(chuàng)建党晋。所以這段代碼將常量池中的對象復制一份放到heap中,并且把heap中的這個對象的引用交給s1 持有徐块。
  • 所以創(chuàng)建2個對象

String真的不能修改嗎未玻?
可以用反射完成String修改,參考如下demo:

Field valueField = String.class.getDeclaredField("value");
valueField.setAccessible(true);
char[] value = (char[]) valueField.get(s);
value[5] = '_';

java.lang.String.intern()本質(zhì)

  • String的intern()方法會查找在常量池中是否存在一份equal相等的字符串,如果有則返回該字符串的引用,如果沒有則添加自己的字符串進入常量池胡控。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扳剿,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子昼激,更是在濱河造成了極大的恐慌庇绽,老刑警劉巖锡搜,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瞧掺,居然都是意外死亡耕餐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門辟狈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肠缔,“玉大人,你說我怎么就攤上這事哼转∶魑矗” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵壹蔓,是天一觀的道長趟妥。 經(jīng)常有香客問我,道長庶溶,這世上最難降的妖魔是什么煮纵? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮偏螺,結(jié)果婚禮上行疏,老公的妹妹穿的比我還像新娘。我一直安慰自己套像,他們只是感情好酿联,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夺巩,像睡著了一般贞让。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柳譬,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天喳张,我揣著相機與錄音,去河邊找鬼美澳。 笑死销部,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的制跟。 我是一名探鬼主播舅桩,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雨膨!你這毒婦竟也來了擂涛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤聊记,失蹤者是張志新(化名)和其女友劉穎撒妈,沒想到半個月后恢暖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡踩身,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年胀茵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挟阻。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡琼娘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出附鸽,到底是詐尸還是另有隱情脱拼,我是刑警寧澤,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布坷备,位于F島的核電站熄浓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏省撑。R本人自食惡果不足惜赌蔑,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竟秫。 院中可真熱鬧娃惯,春花似錦、人聲如沸肥败。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽馒稍。三九已至皿哨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纽谒,已是汗流浹背证膨。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鼓黔,地道東北人央勒。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像请祖,于是被迫代替她去往敵國和親订歪。 傳聞我的和親對象是個殘疾皇子脖祈,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎部分 基礎部分的順序:基本語法肆捕,類相關的語法盖高,內(nèi)部類的語法慎陵,繼承相關的語法眼虱,異常的語法,線程的語...
    子非魚_t_閱讀 31,625評論 18 399
  • 相關閱讀 Java基礎:String類 Java字符串格式化 Java基礎:正則表達式 1. 概述 字符串是由多個...
    JackChen1024閱讀 603評論 0 3
  • 多個字符組成的一串數(shù)據(jù)就是字符串. 1字符串的特點: A:字符串一旦被賦值席纽,就不能改變捏悬。 注意:這里指的是字...
    王子也寂寞閱讀 413評論 0 0
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡上收集的一些資料的整理,因此不免有一些不準確的地方润梯,同時不同JDK版本的...
    高廣超閱讀 15,599評論 3 83
  • String String 類代表字符串纺铭。字符串是常量寇钉;它們的值在創(chuàng)建之后不能更改。 String的方法 .equ...
    朽木丿碎風閱讀 363評論 0 0