很多人一定覺得這個題目老土,稍微有點基礎的人都覺得比較弱智,沒有什么好討論的,因為這個問題討論的太多了。不過你既然進來了,不妨看完,就算給個面子吧,幾分鐘而已,可能你會有點啟發!
很久沒有寫東西了,現在大部分人也不會關心程序的效率問題了,因為CPU總是閑著,內存總是空著。
很多人都覺得對于基本類型用==,對于引用類型用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類的代碼里看到過。
新聞熱點
疑難解答