首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 每日一題:HashSet 存儲字符串常量與 new String 差異

     編輯:Java 綜合教學

題目代碼

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());
    }
}

核心考點

  1. 字符串常量池:str1、str2 為編譯期常量,指向同一個常量池對象(str1 == str2 為 true)。
  2. new String():str3、str4 在堆上創建新對象,str3 != str4,但 str3.equals(str4) 為 true。
  3. 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。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved