1. 程式人生 > 實用技巧 >s == t 何解?

s == t 何解?

Integer s=new Integer(9); Integer t=new Integer(9); Long u=new Long(9);
(s==t) 這個是錯的,只要有new這個關鍵字,就是開闢空間,用的是引用



Integer s =9;
Integer t =9;
(s==t) 這個是對的,在【-128,127】有快取,指向同一個引用



  • int和int之間,用==比較,肯定為true。基本資料型別沒有equals方法
  • int和Integer比較,Integer會自動拆箱,== 和 equals都肯定為true
  • int和new Integer比較,Integer會自動拆箱,呼叫intValue方法, 所以 == 和 equals都肯定為true
  • Integer和Integer比較的時候,由於直接賦值的話會進行自動的裝箱。所以當值在[-128,127]中的時候,由於值快取在IntegerCache中,那麼當賦值在這個區間的時候,不會建立新的Integer物件,而是直接從快取中獲取已經建立好的Integer物件。而當大於這個區間的時候,會直接new Integer。
    當Integer和Integer進行==比較的時候,在[-128,127]區間的時候,為true。不在這個區間,則為false
    當Integer和Integer進行equals比較的時候,由於Integer的equals方法進行了重寫,比較的是內容,所以為true

  • Integer和new Integer : new Integer會建立物件,儲存在堆中。而Integer在[-128,127]中,從快取中取,否則會new Integer.
    所以Integer和new Integer 進行==比較的話,肯定為false ; Integer和new Integer 進行equals比較的話,肯定為true

  • new Integer和new Integer進行==比較的時候,肯定為false ; 進行equals比較的時候,肯定為true
    原因是new的時候,會在堆中建立物件,分配的地址不同,==比較的是記憶體地址,所以肯定不同

  • 裝箱過程是通過呼叫包裝器的valueOf方法實現的
    拆箱過程是通過呼叫包裝器的xxxValue方法實現的(xxx表示對應的基本資料型別)

  • 總結:Byte、Short、Integer、Long這幾個類的valueOf方法實現類似的。所以在[-128,127]區間內,==比較的時候,值總是相等的(指向的是同一物件),在這個區間外是不等的。
    而Float和Double則不相等, Boolean的值總是相等的