Java比较String ==和equals() 解析
2015-08-02 15:13
225 查看
先看一个例子 equals() 比较String
[code]public class TestString { public static void main(String[] args) { String strOne = "testString"; String strTwo = "testString"; System.out.println(strOne.equals(strTwo)); } }
结果为:true
再看 == 比较String
[code]public class TestString { public static void main(String[] args) { String strOne = "testString"; String strTwo= "testString"; System.out.println(strOne == strTwo); } }
结果为:true
分析原因:
String的equals()是比较字符串的内容。故第二个true很容易理解,因为strOne 和strTwo的内容显然相同。==是比较内存地址的,第一个true说明strOne 和strTwo的地址相同。
为什么呢?
java有常量池,存储所有的字符串常量。
String strOne = “testString”
java首先会在常量池查找是否有 “testString”这个常量,发现没有,于是创建一个 “testString”,然后将其赋给strOne。
String strTwo= “String”;
java同样会在常量池中查找 “testString”,这次常量池中已经有strOne 创建的 “testString”,故不创建新的常量,将其地址赋给strTwo。
如此,strOne和strTwo便有了相同的地址。
用String() 来建立String对象
[code]public class TestString { public static void main(String[] args) { String strOne = "testString"; String strThree = new String("testString"); System.out.println(strOne==strThree); System.out.println(strOne.equals(strThree)); } }
结果为:
false
true
[code]public class TestString { public static void main(String[] args) { String strOne = new String("testString"); String strThree = new String("testString"); System.out.println(strOne == strThree); System.out.println(strOne.equals(strThree)); } }
结果相同:
false
true
分析原因:
而用new String(“testString”)创建的两个字符串,用equals()比较相等,用==比较则不相等。为什么呢?
new String()每次会在堆中创建一个对象,每次创建的对象内存地址都不同,故==不相等。但字符串内容是相同的,故equals()相等。
再看关于普通类的
[code]public class TestString { public static void main(String[] args) { Person perOne = new Person(); Person perTwo = new Person(); System.out.println(perOne == perTwo); } } class Person { }
结果为flase
大家都知道,java中一般不用==比较两个对象,而是用equals()
给Person类一个域 id,复写equals()
[code]public class TestString { public static void main(String[] args) { Person perOne = new Person(123); Person perTwo = new Person(123); System.out.println(perOne.equals(perTwo)); } } class Person { private int id; Person(int id) { this.id = id; } @Override public boolean equals(Object o) { if (!(o instanceof Person)) { return false; } Person p = (Person) o; return p.id == id; } }
结果为:true
相关文章推荐
- JNI中 Java 中字符串 转换成C中的字符数组方法
- spring配置文件详解
- Web Service学习-CXF与Spring整合为JavaEE应用发布WebService(三)
- Java:注解(Annotation)自定义注解入门
- @interface java注解
- java 自动拆箱的陷阱
- JDK环境配置
- java编程的一些建议
- Exception in thread "main" java.lang.UnsupportedClassVersionError
- 用 Spring Security 4+Spring MVC+Spring4 构建健壮且安全的web应用
- Java Metrics
- 菜鸟学Struts——I18N对国际化的支持
- Oauth2.0 用Spring-security-oauth2 非常简单
- Reflections让Java的反射更得简单
- 定制Eclipse IDE之杂症篇
- java设计原则
- java入门基础笔记
- 在eclipse中安装activiti插件
- Spring AOP 详解
- springMVC配置静态资源访问的<mvc:resources>标签的使用