1 package com.example.base.string; 2 3 public class MyStringTest { 4 5 public static void main(String args[]) { 6 testString(); 7 } 8 9 private static void testString() { 10 String hello = "Hello"; 11 String hello2 = new String("Hello"); 12 String lo = "lo"; 13 //false. ==比較的是引用.hello是一個字符串常量表達式,並實現為調用interned,以共享不同的示例(string pool) 14 //hello2是一個對象,指向的是堆上的一個地址 15 System.out.println(hello == hello2); //false 16 //true. equals比較的是兩個對象的值 17 System.out.println(hello.equals(hello2)); //true 18 //true. intern()會檢查當前字符串池是否包含這個字符串。包含則返回池中的字符串,否則將字符串對象添加到池中,並返回該字符串對象的引用 19 //(最終結果就是返回一個指向常量池字符串的引用) 20 System.out.println(hello == hello2.intern()); //true 21 //true. 兩個都是常量表達式(編譯時確定的),都是指向字符串池的引用 22 System.out.println(hello == "Hello"); //true 23 //true. 不同類下的兩個常量表達式,依然是指向同一個字符串池的引用 24 System.out.println(Other.hello == hello); //true 25 //true. 不同包下的兩個常量表達式,依然是指向同一個字符串池的引用 26 //System.out.println(com.example.base.string.other.Other.hello == hello); //true 27 //true. 兩個都是常量表達式,都是指向字符串池的引用 28 System.out.println(hello == ("Hel" + "lo")); //true 29 //false. 后者不是常量表達式,是運行時通過串聯計算的字符串(lo是一個對象,不是常亮"xxx"),會新建對象 30 System.out.println(hello == ("Hel" + lo)); //false 31 //true. 將新對象intern()會返回指向字符串池的引用 32 System.out.println(hello == ("Hel" + lo).intern()); //true 33 } 34 } 35 class Other { 36 static String hello = "Hello"; 37 }