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

Java 中 == 與 equals() 核心區別深度解析:從基本類型到包裝類緩存機制

     編輯:Java 程式設計入門

核心結論

  • ==:比較的是內存地址(引用類型)或數值(基本類型)
  • equals():比較的是對象內容,可被重寫(如 String、Integer)

基本類型:自動拆箱與數值比較

int i = 65;
float f = 65.0f;
char c = 'A';  // ASCII 65

System.out.println(i == f);  // true:數值相等
System.out.println(c == f);  // true:字符自動提升為 int 比較

基本類型之間的 == 會觸發數值提升,本質是數值比較。

引用類型:地址 vs 內容

String s1 = new String("hello");
String s2 = new String("hello");

System.out.println(s1 == s2);        // false:不同對象,地址不同
System.out.println(s1.equals(s2));   // true:String 重寫了 equals() 比較字符序列

String 重寫邏輯:先比長度,再逐字符比較,確保內容一致即返回 true。

Integer 緩存機制:-128 到 127 的陷阱

Integer a = 127;
Integer b = 127;
System.out.println(a == b);  // true:命中緩存池

Integer c = 128;
Integer d = 128;
System.out.println(c == d);  // false:超出緩存範圍,新建對象

原理深度剖析

Integer.valueOf(int) 內部實現:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
  • 默認緩存範圍:-128 ~ 127
  • 可通過 -XX:AutoBoxCacheMax=size 擴大上限
  • Long、Short、Byte、Character 同理,Float、Double 不緩存

最佳實踐建議

  1. 基本類型用 ==,引用類型比較內容統一用 equals()
  2. 避免用 == 比較包裝類型,除非確定在緩存範圍內
  3. 自定義類必須重寫 equals() 和 hashCode() 滿足契約
  4. 字符串常量池:"hello" == "hello" 為 true,但 new String("hello") 每次新建對象
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved