equals方法變量和常量位置區別

</pre><pre name="code" class="plain">
我們說的左右位置是基於一個常量一個變量來說的,如果都是變量那麼左右位置沒有任何區別。正常來說這是一個基礎問題,爲什麼我今天又想到了他呢?
</pre><pre>
if (i == 2)
		{
			if (stringtokenizer.hasMoreTokens())
				s2 = stringtokenizer.nextToken(":/");
			else
				s2 = null;
		} else
		if (i == 5)
		{
			s2 = null;
			String s3 = c.a("os.name");
			if (s3 != null && s3.indexOf("z/OS") == -1 && s3.indexOf("OS/390") == -1)
				return null;
		}
		String s4;
		String s5;
		if (i != 5 && s2 != null && s2.equals("/"))
		{
			if (i == 2)
				throw bd.a(this, null, ErrorKey.DEPRECATED_PROTOCOL, s, "10034");
			if (fb.nf || fb.qf || fb.rf)
				throw bd.d(this, null, ErrorKey.T4_CONNECTION_NOT_SUPPORTED, "10035");
			if (!stringtokenizer.nextToken("/").equals("/"))
				throw bd.a(com.ibm.db2.jcc.DB2Driver.class, null, ErrorKey.INVALID_URL_SYNTAX, s, "10041");
			String s6 = stringtokenizer.nextToken(":/");
			if (s6.equals("/"))
			{
				String s8 = null;
				String s10 = null;
				int k = 0;
				String s12 = stringtokenizer.nextToken(":");
				Properties properties3;
				if (stringtokenizer.hasMoreTokens())
				{
					if (!stringtokenizer.nextToken(":").equals(":"))
						throw bd.a(this, null, ErrorKey.INVALID_URL_SYNTAX, s, "13334");
					properties3 = tokenizeURLProperties(stringtokenizer, s, properties);
				} 


以上代碼摘自db2官方jdbc驅動。

在找db2 9.7fp11與fp4 jdbc驅動有什麼區別的時候,反編譯了一下官方驅動jar包,發現裏面不少equals方法依然把未知變量放到了equals的左邊,已知放到了右邊,難道IBM程序員水平這麼次麼?變量放到左右有什麼區別嗎?此時拿出權威的jdk api來看看吧。


equals
public boolean equals(Object obj)指示其他某個對象是否與此對象“相等”。 
equals 方法在非空對象引用上實現相等關係: 

自反性:對於任何非空引用值 x,x.equals(x) 都應返回 true。 
對稱性:對於任何非空引用值 x 和 y,當且僅當 y.equals(x) 返回 true 時,x.equals(y) 才應返回 true。 
傳遞性:對於任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,並且 y.equals(z) 返回 true,那麼 x.equals(z) 應返回 true。 
一致性:對於任何非空引用值 x 和 y,多次調用 x.equals(y) 始終返回 true 或始終返回 false,前提是對象上 equals 比較中所用的信息沒有被修改。 
對於任何非空引用值 x,x.equals(null) 都應返回 false。 
Object 類的 equals 方法實現對象上差別可能性最大的相等關係;即,對於任何非空引用值 x 和 y,當且僅當 x 和 y 引用同一個對象時,此方法才返回 true(x == y 具有值 true)。 

注意:當此方法被重寫時,通常有必要重寫 hashCode 方法,以維護 hashCode 方法的常規協定,該協定聲明相等對象必須具有相等的哈希碼。 


參數:
obj - 要與之比較的引用對象。 
返回:
如果此對象與 obj 參數相同,則返回 true;否則返回 false。
另請參見:
hashCode(), Hashtable


jdk api解釋此方法時都有前提對於任何非空引用值。


對此我們可以做個試驗:

public class Test {
	@SuppressWarnings("rawtypes")
	public static void main(String args[]){
		List list=new ArrayList();
		String str=null;
		System.out.println("0".equals(str));
		System.out.println(str.equals("0"));
		System.out.println("0".equals(list.get(2)));
		System.out.println(list.get(2).equals("0"));
	}
}
以上四個打印分別打印什麼呢?

System.out.println("/".equals(null));
System.out.println("0".equals(str));//false
System.out.println(str.equals("0"));// java.lang.NullPointerException
System.out.println("0".equals(list.get(2)));//Exception in thread "main" java.lang.IndexOutOfBoundsException:
System.out.println(list.get(2).equals("0"));//Exception in thread "main" java.lang.IndexOutOfBoundsException:

由此我們可以知道,當equals中有個一個是變量時,應該把他放在右邊括號內,這樣可以避免參數是null導致的空指針異常,但是這麼寫並不能避免括號內變量引用某些方法或者屬性導致的空指針,例如

String str=null;
		System.out.println("0".equals(str.toString()));

同時如果參數是因爲其他異常而獲取不到值,那麼equals將尊重客觀事實,拋出改異常,代碼執行終止。

通過此事可以看出程序員不可以盲目崇拜,即使是IBM(國際大嘴巴 International Big Mouth)抱有懷疑的態度 凡事問一下爲什麼?會收穫更多。

發佈了85 篇原創文章 · 獲贊 30 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章