前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >equals方法变量和常量位置区别

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

作者头像
西门呀在吹雪
发布2020-11-09 10:31:54
7990
发布2020-11-09 10:31:54
举报
文章被收录于专栏:架构之巅架构之巅
代码语言: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)抱有怀疑的态度 凡事问一下为什么?会收获更多。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-12-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档