详解 String.intern() æ¹æ³
âå¥ï¼ä½ åç»æçé£ç¯æç« æçäºï¼ç»æç´æ¥ææç»çå¾ä¸æ³å¦ Java äºï¼âä¸å¦¹æ°å²å²å°è¯´ã
âåªä¸ç¯åï¼âççä¸å¦¹é¢è²æ²éï¼æå ³å¿å°é®å°ã
âå°±æ¯ç¾å¢ææ¯å¢éæ·±å
¥è§£æ String.intern() é£ç¯åï¼âä¸å¦¹åçã
âå¦ï¼ææ³èµ·æ¥äºï¼ä¸æºå¥½ä¸ç¯æç« åï¼æ·±å ¥æµ åºï¼ç²¾åä¸çç²¾åï¼çå®åä½ åºè¯¥å¯¹ String ç intern æ¹æ³å½»åºçè§£äºæå¯¹åãâ
â好æ¯å¥½ï¼ä½æå°±æ¯ç䏿ï¼âä¸å¦¹å§å±å°è¯´ï¼âå¥ï¼è¿æ¯ä½ 亲èªç»æè®²è®²å§ï¼â
â好å§ï¼ä¸æ¬¡å¦çåç¬¦ä¸²å¸¸éæ± ä½ é½ææ¸ æ¥äºå§ï¼â
âå¯ãâä¸å¦¹å¾®å¾®çç¹äºç¹å¤´ã
è¦çè§£ç¾å¢ææ¯å¢éçè¿ç¯æç« ï¼ä½ åªéè¦è®°ä½è¿å ç¹å 容ï¼
第ä¸ï¼ä½¿ç¨åå¼å·å£°æçå符串对象ä¼ä¿åå¨åç¬¦ä¸²å¸¸éæ± ä¸ã
第äºï¼ä½¿ç¨ new å ³é®åå建çå符串对象ä¼å ä»åç¬¦ä¸²å¸¸éæ± 䏿¾ï¼å¦ææ²¡æ¾å°å°±å建ä¸ä¸ªï¼ç¶ååå¨å ä¸å建å符串对象ï¼å¦ææ¾å°äºï¼å°±ç´æ¥å¨å ä¸å建å符串对象ã
第ä¸ï¼é对没æä½¿ç¨åå¼å·å£°æçå符串对象æ¥è¯´ï¼å°±åä¸é¢ä»£ç ä¸ç s1 飿 ·ï¼
String s1 = new String("äºå¥") + new String("ä¸å¦¹");å¦ææ³æ s1 çå
容乿¾å
¥åç¬¦ä¸²å¸¸éæ± çè¯ï¼å¯ä»¥è°ç¨ intern() æ¹æ³æ¥å®æã
ä¸è¿ï¼éè¦æ³¨æçæ¯ï¼Java 7 çæ¶åï¼åç¬¦ä¸²å¸¸éæ± 仿°¸ä¹ 代ä¸ç§»å¨å°äºå ä¸ï¼è½ç¶æ¤æ¶æ°¸ä¹ ä»£è¿æ²¡æå®å ¨è¢«ç§»é¤ãJava 8 çæ¶åï¼æ°¸ä¹ 代被彻åºç§»é¤ã
è¿ä¸ªååä¹ç´æ¥å½±åäº String.intern() æ¹æ³å¨æ§è¡æ¶ççç¥ï¼Java 7 ä¹åï¼æ§è¡ String.intern() æ¹æ³çæ¶åï¼ä¸ç®¡å¯¹è±¡å¨å 䏿¯å¦å·²ç»å建ï¼åç¬¦ä¸²å¸¸éæ± ä¸ä»ç¶ä¼å建ä¸ä¸ªå
容å®å
¨ç¸åçæ°å¯¹è±¡ï¼ Java 7 ä¹åå¢ï¼ç±äºåç¬¦ä¸²å¸¸éæ± æ¾å¨äºå ä¸ï¼æ§è¡ String.intern() æ¹æ³çæ¶åï¼å¦æå¯¹è±¡å¨å ä¸å·²ç»å建äºï¼åç¬¦ä¸²å¸¸éæ± ä¸å°±ä¸éè¦åå建æ°ç对象äºï¼èæ¯ç´æ¥ä¿åå ä¸å¯¹è±¡çå¼ç¨ï¼ä¹å°±èçäºä¸é¨åçå
å空é´ã
âè¿æ²¡æçè§£æ¸ æ¥ï¼äºå¥âï¼ä¸å¦¹å¾è¦æ¼ã
âå¯ããã嫿ï¼ä¸å¦¹ï¼å æ¥ççè¿æ®µä»£ç è¾åºçç»æå§ãâæè¯´ã
String s1 = new String("äºå¥ä¸å¦¹");
String s2 = s1.intern();
System.out.println(s1 == s2);âå¥ï¼è¿æå®å ¨çä¸åºåï¼è¿æ¯ä½ ç´æ¥è§£éå§ãâä¸å¦¹è¯´ã
â好å§ãâ
第ä¸è¡ä»£ç ï¼åç¬¦ä¸²å¸¸éæ± ä¸ä¼å å建ä¸ä¸ªâäºå¥ä¸å¦¹âç对象ï¼ç¶åå ä¸ä¼åå建ä¸ä¸ªâäºå¥ä¸å¦¹âç对象ï¼s1 å¼ç¨çæ¯å ä¸ç对象ã
第äºè¡ä»£ç ï¼å¯¹ s1 æ§è¡ intern() æ¹æ³ï¼è¯¥æ¹æ³ä¼ä»åç¬¦ä¸²å¸¸éæ± 䏿¥æ¾âäºå¥ä¸å¦¹âè¿ä¸ªå符串æ¯å¦åå¨ï¼æ¤æ¶æ¯åå¨çï¼æä»¥ s2 å¼ç¨çæ¯åç¬¦ä¸²å¸¸éæ± ä¸ç对象ã
ä¹å°±æå³ç s1 å s2 çå¼ç¨å°åæ¯ä¸åçï¼ä¸ä¸ªæ¥èªå ï¼ä¸ä¸ªæ¥èªåç¬¦ä¸²å¸¸éæ± ï¼æä»¥è¾åºçç»æä¸º falseã
âæ¥çä¸ä¸è¿è¡ç»æãâæè¯´ã
falseâææ¥ç»å¹ å¾ï¼å¸®å©ä½ çè§£ä¸ãâçå°ä¸å¦¹æè®¶ç表æ ï¼æèå¿å°è¯´ã

âè¿ä¸çè§£äºå§ï¼âæé®ä¸å¦¹ã
âå¯å¯ï¼ä¸ä¸åå°±è±ç¶å¼æäºï¼âä¸å¦¹è¯´ã
âå¥½ï¼æä»¬åæ¥çä¸é¢è¿æ®µä»£ç ãâ
String s1 = new String("äºå¥") + new String("ä¸å¦¹");
String s2 = s1.intern();
System.out.println(s1 == s2);âé¾éä¹è¾åº false ï¼âä¸å¦¹æç¹ä¸ç¡®å®ã
âä¸ï¼è¿æ®µä»£ç ä¼è¾åº trueãâæå¦å®äºä¸å¦¹ççæµã
â为å¥åï¼âä¸å¦¹è¿«åå°æ³è¦ç¥éçæ¡ã
第ä¸è¡ä»£ç ï¼ä¼å¨åç¬¦ä¸²å¸¸éæ± ä¸å建两个对象ï¼ä¸ä¸ªæ¯âäºå¥âï¼ä¸ä¸ªæ¯âä¸å¦¹âï¼ç¶åå¨å ä¸ä¼å建两个å¿å对象âäºå¥âåâä¸å¦¹âï¼æåè¿æä¸ä¸ªâäºå¥ä¸å¦¹âç对象ï¼ç¨åä¼è§£éï¼ï¼s1 å¼ç¨çæ¯å ä¸âäºå¥ä¸å¦¹âè¿ä¸ªå¯¹è±¡ã
第äºè¡ä»£ç ï¼å¯¹ s1 æ§è¡ intern() æ¹æ³ï¼è¯¥æ¹æ³ä¼ä»åç¬¦ä¸²å¸¸éæ± 䏿¥æ¾âäºå¥ä¸å¦¹âè¿ä¸ªå¯¹è±¡æ¯å¦åå¨ï¼æ¤æ¶ä¸åå¨çï¼ä½å ä¸å·²ç»åå¨äºï¼æä»¥åç¬¦ä¸²å¸¸éæ± ä¸ä¿åçæ¯å ä¸è¿ä¸ªâäºå¥ä¸å¦¹â对象çå¼ç¨ï¼ä¹å°±æ¯è¯´ï¼s2 å s1 çå¼ç¨å°åæ¯ç¸åçï¼æä»¥è¾åºçç»æä¸º trueã
âæ¥çä¸ä¸è¿è¡ç»æãâæè¸ææç«¹å°è¯´ã
trueâæåæ¥ç»å¹ å¾ï¼å¸®å©ä½ çè§£ä¸ãâ

âåï¼ææç½äºï¼âä¸å¦¹é¿èä¸å£æ°ï¼å¤§æææ ¨ intern 乿²¡ä»ä¹é¾çè§£çæå³ï¼âä¸è¿ï¼ææä¸ä¸ªçæï¼âäºå¥ä¸å¦¹âè¿ä¸ªå¯¹è±¡æ¯ä»ä¹æ¶åå建çå¢ï¼â
âä¸å¦¹ï¼ä¸éåï¼è½æä½é®é¢çå
³é®ãåæ¥è§£éä¸ä¸ String s1 = new String("äºå¥") + new String("ä¸å¦¹") è¿è¡ä»£ç ãâæå¯¹ä¸å¦¹ç表ç°é常å¼å¿ã
- å建 "äºå¥" å符串对象ï¼åå¨å¨åç¬¦ä¸²å¸¸éæ± ä¸ã
- å建 "ä¸å¦¹" å符串对象ï¼åå¨å¨åç¬¦ä¸²å¸¸éæ± ä¸ã
- æ§è¡
new String("äºå¥")ï¼å¨å ä¸å建ä¸ä¸ªå符串对象ï¼å 容为 "äºå¥"ã - æ§è¡
new String("ä¸å¦¹")ï¼å¨å ä¸å建ä¸ä¸ªå符串对象ï¼å 容为 "ä¸å¦¹"ã - æ§è¡
new String("äºå¥") + new String("ä¸å¦¹")ï¼ä¼å建ä¸ä¸ª StringBuilder 对象ï¼å¹¶å° "äºå¥" å "ä¸å¦¹" 追å å°å ¶ä¸ï¼ç¶åè°ç¨ StringBuilder 对象ç toString() æ¹æ³ï¼å°å ¶è½¬æ¢ä¸ºä¸ä¸ªæ°çå符串对象ï¼å 容为 "äºå¥ä¸å¦¹"ãè¿ä¸ªæ°çå符串对象åå¨å¨å ä¸ã
ä¹å°±æ¯è¯´ï¼å½ç¼è¯å¨éå° + å·è¿ä¸ªæä½ç¬¦çæ¶åï¼ä¼å° new String("äºå¥") + new String("ä¸å¦¹") è¿è¡ä»£ç ç¼è¯ä¸ºä»¥ä¸ä»£ç ï¼
new StringBuilder().append("äºå¥").append("ä¸å¦¹").toString();å®é æ§è¡è¿ç¨å¦ä¸ï¼
- å建ä¸ä¸ª StringBuilder 对象ã
- å¨ StringBuilder 对象ä¸è°ç¨ append("äºå¥")ï¼å° "äºå¥" 追å å° StringBuilder ä¸ã
- å¨ StringBuilder 对象ä¸è°ç¨ append("ä¸å¦¹")ï¼å° "ä¸å¦¹" 追å å° StringBuilder ä¸ã
- å¨ StringBuilder 对象ä¸è°ç¨ toString() æ¹æ³ï¼å° StringBuilder 转æ¢ä¸ºä¸ä¸ªæ°çå符串对象ï¼å 容为 "äºå¥ä¸å¦¹"ã
å ³äº StringBuilderï¼æä»¬éåä¼è¯¦ç»å°è®²å°ãä»å¤©å äºè§£å°è¿ã
ä¸è¿éè¦æ³¨æçæ¯ï¼å°½ç®¡ intern å¯ä»¥ç¡®ä¿ææå ·æç¸åå 容çåç¬¦ä¸²å ±äº«ç¸åçå å空é´ï¼ä½ä¹ä¸è¦çç¨ internï¼å 为任ä½çç¼åæ± é½æ¯æå¤§å°éå¶çï¼ä¸è½æ ç¼æ æ å°±å ç¨äºç¸å¯¹ç¨ç¼ºçç¼å空é´ï¼å¯¼è´å ¶ä»å符串没æåä½å¯å ã
å¦å¤ï¼åç¬¦ä¸²å¸¸éæ± æ¬è´¨ä¸æ¯ä¸ä¸ªåºå®å¤§å°ç StringTableï¼å¦ææ¾è¿å»çå符串è¿å¤ï¼å°±ä¼é æä¸¥éçåå¸å²çªï¼ä»è导è´é¾è¡¨åé¿ï¼é¾è¡¨åé¿ä¹å°±æå³çåç¬¦ä¸²å¸¸éæ± çæ§è½ä¼å¤§å¹ ä¸éï¼å 为è¦ä¸ä¸ªä¸ä¸ªæ¾æ¯éè¦è±è´¹æ¶é´çã
â好äºï¼ä¸å¦¹ï¼å ³äº String ç intern 就讲å°è¿å§ï¼è¿æ¬¡çè§£äºå§ï¼âæé®ã
âå¥ï¼ä½ çæ£ï¼â
çå°ä¸å¦¹ä¸ç¹ä¸æ»´çè¿æ¥ï¼æä¹æå°ç±è¡·çå¼å¿ã
GitHub 䏿 æ 10000+ ç弿ºç¥è¯åºãäºå¥ç Java è¿é¶ä¹è·¯ã第ä¸ç PDF ç»äºæ¥äºï¼å æ¬Javaåºç¡è¯æ³ãæ°ç»&å符串ãOOPãéåæ¡æ¶ãJava IOãå¼å¸¸å¤çãJava æ°ç¹æ§ãç½ç»ç¼ç¨ãNIOãå¹¶åç¼ç¨ãJVMççï¼å ±è®¡ 32 ä¸ä½åï¼500+å¼ æç»å¾ï¼å¯ä»¥è¯´æ¯éä¿ææãé£è¶£å¹½é»â¦â¦è¯¦æ æ³ï¼å¤ªèµäºï¼GitHub 䏿 æ 10000+ ç Java æç¨
å¾®ä¿¡æ æ²é»çäº ææ«æä¸æ¹äºç»´ç å ³æ³¨äºå¥çååå ¬ä¼å·æ²é»çäºï¼åå¤ 222 å³å¯å è´¹é¢åã

