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

 今天偶然看到stackoverflow上关于==和.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是个毛! 找到相关内容,点击跳转

 

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

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值