Java 中String对象比较方法equals和等号==
2016-04-07 11:08
591 查看
转载来源为:developinglife
网址:http://blog.chinaunix.net/uid-23781137-id-3436455.html
String s1 = new String("hello");
String s2 = new String("hello");
String s31 = s2;
String s32 = new String(s2);
String s4 = "hello";
String s5 = "hello";
String s61 = s5;
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(s31));//true
System.out.println(s1.equals("hello"));//true
System.out.println();
System.out.println(s1 == s2);//false
System.out.println(s1 == s31);//false
System.out.println(s1 == "hello");//false
System.out.println();
System.out.println(s2 == s31);//true
System.out.println(s2 == s32);//false
System.out.println(s32 == "hello");//false
System.out.println();
System.out.println(s4.equals(s5));//true
System.out.println(s4.equals(s61));//true
System.out.println(s4.equals("hello"));//true
System.out.println();
System.out.println(s4 == s5);//true
System.out.println(s4 == s61);//true
System.out.println(s4 == "hello");//true
System.out.println();
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("hello");
System.out.println(sb1.equals(sb2));//false
System.out.println(sb1 == sb2);//false
“因为String太过常用,JAVA类库的设计者在实现时做了个小小的变化,即采用了享元模式,每当生成一个新内容的字符串时,他们都被添加到一 个共享池中,当第二次再次生成同样内容的字符串实例时,就共享此对象,而不是创建一个新对象,这样的做法仅仅适合于通过=符号进行的初始化”
Java中,“==”运算符用来比较两个引用以查看它们是否指向同一个内存对象。而对于String实例,运行时状态会尽可能地确保任意两个具有相同字符信息的String字面值指向同一个内部对象。此过程称为驻留(interning),但是它并不有助于每个String的比较。一个原因是垃圾收集器线程删除了驻留值,另一个原因是String所在的位置可能被一个由String构造函数创建的新实例占用。如果是这样,“==”将总是返回false。
StringBuffer的情况:
StringBuffer e = new StringBuffer("hjy");
StringBuffer f = new StringBuffer("hjy");
System.out.println( e==f );//false
System.out.println( e.equals(f));//false
StringBuffer从Object里继承了Equals(),所以仍是比较内存的,和==一样,e和f内存地址不同,所以都返回false。
扩展:
对Boolean、Character、Byte、Shot、Integer、Long、Float、Double 来说,和String一样:,==是比较地址的,equals()是比较内容的。这些java自带的封装类里重载好了。
总结:
equals():在object中,是用来比较内存地址的,但是在String以及上面提到的几个类里,是比较内容的,即使是不同地址,只要内容一致,返回true;
==:在哪里都是比较地址(除了java自带类型——int a = 3 ; int b = 3; 这里a和b,地址不同,但它们是自带类型,直接比较值,依然返回true)。
例如double tempD与d的值是一样的
网址:http://blog.chinaunix.net/uid-23781137-id-3436455.html
String s1 = new String("hello");
String s2 = new String("hello");
String s31 = s2;
String s32 = new String(s2);
String s4 = "hello";
String s5 = "hello";
String s61 = s5;
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(s31));//true
System.out.println(s1.equals("hello"));//true
System.out.println();
System.out.println(s1 == s2);//false
System.out.println(s1 == s31);//false
System.out.println(s1 == "hello");//false
System.out.println();
System.out.println(s2 == s31);//true
System.out.println(s2 == s32);//false
System.out.println(s32 == "hello");//false
System.out.println();
System.out.println(s4.equals(s5));//true
System.out.println(s4.equals(s61));//true
System.out.println(s4.equals("hello"));//true
System.out.println();
System.out.println(s4 == s5);//true
System.out.println(s4 == s61);//true
System.out.println(s4 == "hello");//true
System.out.println();
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("hello");
System.out.println(sb1.equals(sb2));//false
System.out.println(sb1 == sb2);//false
“因为String太过常用,JAVA类库的设计者在实现时做了个小小的变化,即采用了享元模式,每当生成一个新内容的字符串时,他们都被添加到一 个共享池中,当第二次再次生成同样内容的字符串实例时,就共享此对象,而不是创建一个新对象,这样的做法仅仅适合于通过=符号进行的初始化”
Java中,“==”运算符用来比较两个引用以查看它们是否指向同一个内存对象。而对于String实例,运行时状态会尽可能地确保任意两个具有相同字符信息的String字面值指向同一个内部对象。此过程称为驻留(interning),但是它并不有助于每个String的比较。一个原因是垃圾收集器线程删除了驻留值,另一个原因是String所在的位置可能被一个由String构造函数创建的新实例占用。如果是这样,“==”将总是返回false。
StringBuffer的情况:
StringBuffer e = new StringBuffer("hjy");
StringBuffer f = new StringBuffer("hjy");
System.out.println( e==f );//false
System.out.println( e.equals(f));//false
StringBuffer从Object里继承了Equals(),所以仍是比较内存的,和==一样,e和f内存地址不同,所以都返回false。
扩展:
对Boolean、Character、Byte、Shot、Integer、Long、Float、Double 来说,和String一样:,==是比较地址的,equals()是比较内容的。这些java自带的封装类里重载好了。
总结:
equals():在object中,是用来比较内存地址的,但是在String以及上面提到的几个类里,是比较内容的,即使是不同地址,只要内容一致,返回true;
==:在哪里都是比较地址(除了java自带类型——int a = 3 ; int b = 3; 这里a和b,地址不同,但它们是自带类型,直接比较值,依然返回true)。
例如double tempD与d的值是一样的
相关文章推荐
- spring配置
- Java中int与String互转
- 2016.4.07定义一个spring注释注入
- 随笔---java中hashMap工作原理的总结
- Myeclipse 2014 SVN组件加载失败处理
- springmvc 页面和后台传值乱码问题
- PowerDesigner(八)-面向对象模型(用例图,序列图,类图,生成Java源代码及Java源代码生成类图)
- MyEclipse 导入已存在的项目
- Spring读书笔记-----Spring的Bean之Bean的基本概念
- java 集合精简之路
- java中MD5加密Demo
- Java泛型
- struts2使用域模型传递参数
- Java基础
- Java Collections Framework(JAVA集合框架)中的常用集合及其特点、适用场景、实现原理简介
- eclipse 创建并运行maven web项目
- Eclipse build path 功能总结
- 给Eclipse提速的7个技巧
- ACM:POJ-1979 Red And Black(JAVA的字符数组输入以及标记方法)
- java.util.zip.ZipException: zip file is empty