1. 程式人生 > 其它 >輕鬆瞭解一下 equals和==的比較

輕鬆瞭解一下 equals和==的比較

首先資料型別分為基本型別和引用型別。
基本型別(float、double、byte、short、int、long、char、boolean):變數直接儲存的是值;
引用型別:儲存的是記憶體地址。

對於數值,equals和 == 的比較
1、equals和==都是比較兩個物件的引用是否相等,即是否指向同一個物件。
在這裡插入圖片描述

2、equals方法不能作用於基本型別的比較,也即 基本型別的比較只能使用==

特殊情況:
(1)Integer、int

  • 對於Integer a = 127,編譯器會把Integer a = 127轉換為 Integer.valueOf(127),檢視原始碼可以知道這個轉換在內部是做了快取,當數值在【-128,127】之間時才有快取,否則還是生成的一個新物件。所以:
Integer i = 25;
Integer j = 25;
i==j;//true;

Integer m = 129;
Integer n = 129;
m==n;//false;
m.intValue()==n;//true;因為intValue將m作為int型別
  • 怎麼改變Integer快取在【-128,1000】?設定JVM引數:-XX:AutoBoxCacheMax=1000
  • 使用== 對一個127直接賦值的Integer和new Integer(127)判斷
Integer i = 127;
Integer j = new Integer(127);
i==j;// false

原因:new出來的物件是始終不走快取的物件,比較兩個新物件,結果肯定是不一樣的。

  • 使用 == 對一個直接賦值128的Integer物件和另一個值為128的int基本型別判等
Integer i = 128;
int j = 128;
i==j;//true

原因:Integer i = 128;是拆箱後再比較,拆箱後就是int,int型別是基本型別(比較的是值)

總結:比較Integer的值使用equals或者Integer.intValue(),比較int只能使用==

(2)String的equals
首先equals本來比較的就是兩個物件是不是相等(記憶體地址),但是在String中有重寫equals方法,它首先判斷的是兩個物件的引用是否指向同一記憶體地址,是的話就返回true ,否則繼續往下走,往下走時,判斷是否為String類的物件,然後比較兩個字串的長度和記憶體,當都相等的時候就返回true ,否則返回false。

String a = “sss”;//String作為基本型別來使用,如果值不同,物件就不相同。這裡涉及到String池
String是不可變的,new String(“sss”),首先會在String池中建立一個物件“abc”,由於有new,所以會分配地址空間,複製String池的內容,當出現的String物件在String池中不存在時才會在String池中建立該物件。
所以

String a = "sss";
String b = "sss";
a==b;//true.都是String池裡的物件