很多人都觉得对于基本类型用
==
,对于引用类型用equals(),为什么呢?

对于引用类型如果可以用
==
代替equals(),可以大大提高效率。不用说了,我们不关心效率!但是如果能提高
100倍甚至1000倍你也不关心,那就不用往下看了。

只举两例:

1
.如何判断一个Class是否指定的类型

如果你想到instanceof,说明你还是不错的,不过这里不能用instanceof,这里就判断是否String为例吧。
给定一个Class c,判断是否为String类的Class
方法1:
boolean
b
=
c.getName().equals(String.
class
.getName());
方法2:
boolean
b
=
(c
==
String.
class
);

第一种方法太烂了,第二种方法至少快100倍,甚至1000倍或者10000倍,因为用
==
几乎不用时间
我们知道字符串的比较是一个字符一个字符比较。

结论:对于可以使用
==
的比较,不要使用equals();一般单例类的实例可以使用
==
,比如枚举类。

2
.对于字符串用
==
代替equals()
?
既然
==
效率这么高,而且String是一个不可变的,可不可以用
==
代替equals呢?
String s1
=
"
hello
"
;
String s2
=
"
hello
"
;
boolean
eq
=
(s1
==
s2);
这里当然可以用
==
代替,因为他们是同一个对象,但是如果用了new的话就不行了.
对于字符串从不用new生成是不是就可以用
==
代替equals呢
?
还是不行,这里举一个例子吧:
String s1
=
"
hello
"
;
StringBuffer sb
=
new
StringBuffer(s1);
String s2
=
sb.toString();
boolean
b
=
(s1
==
s2);
//
false
结论:特定场合可以使用
==
代替,因为大部分情况下不能用
==
,所以除非性能太重要了,否则不用
==
代替equals,因为你这样写别人可能就看不懂了。

3
.真的那么好用吗
?
看到
==
的效率这么高,就一直想用,我就变通一下:

boolean
eq(String s1,String s2)
{
s1
=
s1.intern();
s2
=
s2.intern();
return
s1
==
s2;
}
能想到这样使用真的不简单,但是这样不但没有提高效率,反而大大降低了效率.
因为intern本身就比equals来的慢,你这里还两次!
不过这种用法我在Class类的代码里看到过。
|