您的位置:首页 > 编程语言 > Java开发

Java中"=="和equals方法在字符串比较中的不同

2015-09-13 10:53 323 查看
昨天写代码的时候,遇到了比较两个字符串的值是否相同的情况,然后发现使用"=="和equals会得到不同的结果。其实我的目的是比较两个字符串的序列是否相同,这个时候应该使用equals方法的。大家在比较两个字符串的时候一定要想明白自己到底是要比较这两个字符串的什么,是序列还是引用?现在把自己总结的内容写下来。

首先介绍什么是字符串池:Java中有一个字符串池,其实是很多字符串的一个集合。字符串池由字符串直接量(注意:像”trttr” + “gergre”这样的形式也算不上字符串直接量,必须是String s="12345",这样的形式),有限个字符串直接量进行+运算得到的结果,类java.lang.String的成员方法intern创建的字符串实例对象这3个部分组成。无论字符串池中的字符串是由其中哪个方法形成的,在比较的时候是没有区别的,你可以把他们看成都是字符串直接量。比如:"123456",
"123"+"456", "123456".intern(), 这3者在池中是一样的。

运算符“==”,用来判断其两侧的两个引用值是否相等,即是否指向相同的实例对象。所以当通过==返回true时,有这样两种可能:1,两个字符串引用都指向字符串池中的同一个字符串值,2.两个引用都指向字符串池外的同一个实例对象,比如
<span style="white-space:pre">		</span>//此时a==b返回true
<span style="white-space:pre">		</span>String a = new String("123");
<span style="white-space:pre">		</span>String b = a;


String中的equals方法判断两个字符串引用指向的字符串的序列是否相等,无论这两个字符串引用都是指向字符串池或者字符串池外还是一个指向字符串池一个指向池外,所以对于比较两个字符串的序列是否相等一般都用eauals(在实际情况中我们一般都是用到这个)。

总结一下就是:比较字符串序列是否相等用equals, 比较字符串是否指向同一个实例对象用==。

以下是我列出的各种字符串引用可能指向的值,你可以通过对他们使用equalis和==来进行理解。

String a = new String("123");
String b = a;
String c = a.intern();
String d = "12" + "3";
String f = "123".intern();
String h = "123";
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: