題目代碼
public class Ques1110 {
public static void main(String[] args){
String str1 = "123";
String str2 = "123";
String str3 = new String("123");
String str4 = new String("123");
HashSet<String> set = new HashSet<>();
set.add(str1);
set.add(str2);
set.add(str3);
set.add(str4);
System.out.println(set.size());
}
}
核心考點
- 字符串常量池:
str1、str2 為編譯期常量,指向同一個常量池對象(str1 == str2 為 true)。
- new String():
str3、str4 在堆上創建新對象,str3 != str4,但 str3.equals(str4) 為 true。
- HashSet 去重依據:
hashCode() 相同且 equals() 返回 true 視為重複。
執行結果
1
詳細解析
String 重寫了 hashCode() 與 equals(),內容相同即視為相等。
- 四個變量雖然對象身份不同,但內容均為
"123",equals 比較均為 true。
HashSet 依次添加:第一次加入成功,後三次 equals 命中已有元素,add 返回 false,集合大小保持 1。
延伸思考
- 若改為
IdentityHashMap(使用 == 比較),結果將為 3(str1/str2 同一引用、str3、str4 各自不同)。
String.intern() 可將堆上字符串放入常量池並返回常量池引用,str3.intern() == str1 為 true。
