equals方法变量和常量位置区别

2020-11-09 10:31:54 浏览数 (1)

代码语言:javascript复制
</pre><pre name="code" class="plain">

我们说的左右位置是基于一个常量一个变量来说的,如果都是变量那么左右位置没有任何区别。正常来说这是一个基础问题,为什么我今天又想到了他呢?

代码语言:javascript复制
</pre><pre>
代码语言:javascript复制
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来看看吧。

代码语言:javascript复制
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解释此方法时都有前提 对于任何非空引用值。

对此我们可以做个试验:

代码语言:javascript复制
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导致的空指针异常,但是这么写并不能避免括号内变量引用某些方法或者属性导致的空指针,例如

代码语言:javascript复制
String str=null;
		System.out.println("0".equals(str.toString()));

同时如果参数是因为其他异常而获取不到值,那么equals将尊重客观事实,抛出改异常,代码执行终止。

通过此事可以看出程序员不可以盲目崇拜,即使是IBM(国际大嘴巴 International Big Mouth)抱有怀疑的态度 凡事问一下为什么?会收获更多。

0 人点赞