当前位置:首页软件开发Java → Java中String的相等判断,==和.equals()总结

Java中String的相等判断,==和.equals()总结

时间:2019-04-17 03:51:56来源:互联网我要评论(0)

关于==和.equals()的分析

 

==            测试引用相等。

.equals()  测试值相等。

 

所以呢,

如果你真的想看这两个string是不是有相同的值,那就用.equals()(除了一些特殊的情况,你得保证这两个有着相同value的string是用同一种对象表现的,例如String interning)

==呢,是用来测试两个字符串是否是同一个对象

 

看看一下代码吧!(格式略微有些乱)

public static void main(String[] args) throws IOException, MemfisException{
	String t1 = new String("T");
	String t2 = t1;
	
	// These two have the same object
	System.out.println("1.	t1 == t2  -->  "+(t1 == t2)); 
	
	// These two have the same value
	System.out.println("2.	new String(\"test\").equals(\"test\")  -->  "+new String("test").equals("test"));  

	// ... but they are not the same object
	System.out.println("3.	new String(\"test\") == \"test\"  -->  "+(new String("test") == "test")); 

	// ... neither are these
	System.out.println("4.	new String(\"test\") == new String(\"test\")  -->  "+(new String("test") == new String("test"))); 

	// ... but these are because literals are interned by 
	// the compiler and thus refer to the same object
	System.out.println("5.	\"test\" == \"test\"  -->  "+("test" == "test")); 

	// concatenation of string literals happens at compile time,
	// also resulting in the same object
	System.out.println("6.	\"test\" == \"te\" + \"st\"  -->  "+("test" == "te" + "st"));
	
	// but .substring() is invoked at runtime, generating distinct objects
	System.out.println("7.	\"test\" == \"!test\".substring(1)  -->  "+("test" == "!test".substring(1)));
	
	// interned strings can also be recalled by calling .intern()
	System.out.println("8.	\"test\" == \"!test\".substring(1).intern()  -->  "+("test" == "!test".substring(1).intern()));  
	
}	

 

执行结果:

1.t1 == t2  -->  true

2.new String("test").equals("test")  -->  true

3.new String("test") == "test"  -->  false

4.new String("test") == new String("test")  -->  false

5."test" == "test"  -->  true

6."test" == "te" + "st"  -->  true

7."test" == "!test".substring(1)  -->  false

8."test" == "!test".substring(1).intern()  -->  true

 

在把String中的.equals()方法拿出来看一下,瞬间释然了

public boolean equals (Object object) {
	if (object == this) return true;
	if (object instanceof String) {
		String s = (String)object;
		if (count != s.count ||
			(hashCode != s.hashCode && hashCode != 0 && s.hashCode != 0))
				return false;
		return regionMatches(0, s, 0, count);
	}
	return false;
}

 原来.equals()方法这么高达上,已经兼容到了 == 的功能了哦~~

 

 找了一下intern()这个方法,代码如下

public native String intern();
 

native,它是一个用其它语言来实现的一个方法?!和Java Native Interface一起执行。

这个native的用途就是把一个string,先从table中搜索,看看有没有和这个相同的对象,如果有,就换成是那个对象,如果没有,就是一个新的对象,这样就可以解释为什么最后那句代码"test" == "!test".substring(1).intern()是true了!

 

相关文章

网友评论

热门评论

最新评论

发表评论 查看所有评论()

昵称:
表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
字数: 0/500 (您的评论需要经过审核才能显示)

关于万荚 | 联系方式 | 发展历程 | 版权声明 | 帮助(?) | 网站地图 | 友情链接

Copyright 2005-2019 16WJ.COM 〖万荚网〗 版权所有 桂ICP备18000060号 |

声明: 本站所有文章来自互联网 如有异议 请与本站联系