Groovy Tip 1 ==、equals及其他
我们说基于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
(),系统永远为它生成新的对象。