程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Groovy >> Groovy Tip 1 ==、equals及其他

Groovy Tip 1 ==、equals及其他

編輯:Groovy

我們說基於Groovy語言的Java項目開發是一個敏捷的開發,除了我們使用Grails作為Web開發平台,Groovy語言本身就提供了很多敏捷的地方。

我們知道,在Java語言中,判斷兩個字符串的值是否相等,我們使用equals方法,而“==”作為判斷兩個對象引用是否相同的符號。事實證明,我們使用equals方法多過使用“==”符號,特別是在字符串的使用中。

在實際編碼的過程中,形如:

if(abc1.equals(abc2))
  {
    ……
  }

這樣的if語言特別多,但是我們每一次都得拼寫equals方法,而不是簡單的使用“==”符號。雖然Eclipse等IDE能夠幫我們把equals方法拼寫完整,但使用equals方法畢竟耽誤了我們的時間,遠遠沒有使用“==”符號敏捷。

Groovy語言考慮到了我們的這個實際的需求,果斷的使用“==”符號代替了equals方法,來提供Groovy語言編程的敏捷性。

def abc1 = 'abc'
  def abc2 = "abc"
println abc1 == abc2

打印的結果為true。

這樣,我們就不必再if(abc1.equals(abc2))了,而可以直接使用:

if(abc1==abc2)
  {
    ……
  }

是不是方便了很多?

甚至判斷Collection兩個對象的內容是否相同也可以使用“==”符號,如:

def list1 = [1]
  def list2 = [1]
println list1 == list2

你可以把上面的語句運行看看,結果為true。

兩個Map對象的內容是否相同也可以使用“==”符號判斷,如:

def map1 = ['name':'tom']
  def map2 = ['name':'tom']
println map1 == map2

結果為true。但是你要運行下面的語句:

def map1 = ['name':'tom']
  def map3 = ['name':'alice']
println map1 == map3

結果卻是false了,原因很簡單:map1和map2的key為“name”時,value卻不同。

你可能要問,既然“==”符號是判斷兩個對象的內容是否相同,那麼用什麼來判斷兩個對象的引用是否相同呢?

其實很簡單,在Groovy語言中,我們使用is方法來判斷兩個對象的引用是否相同。如:

def list1 = [1]
  def list2 = [1]
println list1.is(list2)

你可能想象得到,上面的語句運行結果為false。

但是,如果是下面的語句:

def list1 = [1]
  def list2 = [1]
  list2 = list1
println list1.is(list2)

聰明的你一定知道,運行結果為true。

但是你看看下面的語句:

def abc1 = 'abc'
  def abc2 = "abc"
println abc1.is(abc2)

猜猜它的運行結果是什麼?

是的,結果為true。

Stop!你剛剛不是說了,判斷兩個對象的引用是否相同使用“==”符號啊,現在abc1和abc2是兩個引用啊。

不錯,abc1和abc2是兩個引用,但是是兩個相同的引用,都指向同一個對象“abc”。在聲明def abc1 = 'abc'時,系統會生成一個“abc”對象,同時將引用abc1指向該對象;但是,在聲明def abc2 = "abc"時,系統不再生成新的“abc”對象,而是直接將引用abc2指向上面已經生成了的“abc”對象。所以abc1和abc2指向同一個對象。

如果你還沒有想清楚,請結合下面的例子再想一想:

String a1 = new String('a')
  String a2 = "a"
println a1.is(a2)

是的,結果為false。

對於new String(),系統永遠為它生成新的對象。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved