1. 程式人生 > 實用技巧 >Groovy In Action 筆記 (2)

Groovy In Action 筆記 (2)

聊聊Groovy中的 '==' 與 'equals'

先看看Java中它們的區別

  • '=='
    • 對於值型別,則比較值
    • 對於引用型別,則比較兩個變數是否指向的為相同記憶體地址
  • 'equals'
    • 如果類沒有override此方法,則比較兩個變數是否指向的為相同記憶體地址
    • 如果有override此方法,則使用子類實現的邏輯進行比較,如String類。
  • 如下程式碼
    • /*
       * This Java source file was generated by the Gradle 'init' task.
       */
      package practices;
      
      public class App {
          
      public static void main(String[] args) { String str1 = "Hello"; String str2 = "Hello"; String str3 = new String("Hello"); System.out.println(str1 == str2) ;// true System.out.println(str1 == str3) ;// false System.out.println(str1.equals(str2)) ;// true System.out.println(str1.equals(str3)) ;
      // true } }

再看看Groovy中的表現:

  • =='
    • 對於值型別,則比較值
    • 對於引用型別,則比較兩個變數是否指向的為相同記憶體地址 -- 注意String 型別有例外,String類override了==操作符,實現了內容比較
  • 'equals'
    • 如果類沒有override此方法,則比較兩個變數是否指向的為相同記憶體地址
    • 如果有override此方法,則使用子類實現的邏輯進行比較,如String類。
  • 如下程式碼
    • def str1 = "hello"
      def str2 = "hello"
      def str3 = new String("hello")
      
      println(str1 
      == str2) // true println(str1 == str3) // true println(str1.equals(str2)) // true println(str1.equals(str3)) // true

ps:

  Groovy與Java中instanceof 操作為true的前提:兩個類由相同的classloader載入。如果使用不同的載入器,即使載入相同的程式碼檔案,對兩個類的例項使用 instanceof,結果均為false.