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.两个引用都指向字符串池外的同一个实例对象,比如
String中的equals方法判断两个字符串引用指向的字符串的序列是否相等,无论这两个字符串引用都是指向字符串池或者字符串池外还是一个指向字符串池一个指向池外,所以对于比较两个字符串的序列是否相等一般都用eauals(在实际情况中我们一般都是用到这个)。
总结一下就是:比较字符串序列是否相等用equals, 比较字符串是否指向同一个实例对象用==。
以下是我列出的各种字符串引用可能指向的值,你可以通过对他们使用equalis和==来进行理解。
首先介绍什么是字符串池: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";
相关文章推荐
- Java 单例模式详解
- java学习之String类
- TestNG+eclipse+selenium2的环境搭建和基础配置
- 《Java面向对象程序设计》
- java学习之Scanner类
- 【转+分析】JAVA: 为什么要使用"抽象类"? 使用"抽象类"有什么好处?
- java反射覆写toString方法实现输出实体类属性值
- Java开源CMS系统
- ajax结合springmvc报406错误
- Struts2环境配置
- java Biginteger类和BigDecimal类
- Java静态代理、动态代理以及AOP
- spring mvc 异常统一处理方式
- java 猜数字小游戏
- java swing版哈佛曼压缩软件
- Eclipse关联java源代码
- Java基础-----常用API
- Java基础(一)
- 计算两个GPS坐标的距离方法 - Java语言
- java 集装箱 arraylist 用法