Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631172
  • 博文数量: 87
  • 博客积分: 3399
  • 博客等级: 中校
  • 技术积分: 1422
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 21:20
文章分类

全部博文(87)

文章存档

2013年(1)

2012年(51)

2011年(33)

2010年(2)

分类: Java

2012-12-11 17:16:19

        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

StringBufferObject里继承了Equals(),所以仍是比较内存的,和==一样,ef内存地址不同,所以都返回false

 

扩展:

    对BooleanCharacterByteShotIntegerLongFloatDouble 来说,和String一样:,==是比较地址的,equals()是比较内容的。这些java自带的封装类里重载好了。

总结:

    equals():object中,是用来比较内存地址的,但是在String以及上面提到的几个类里,是比较内容的,即使是不同地址,只要内容一致,返回true;

    ==:在哪里都是比较地址(除了java自带类型——int a = 3 ; int b = 3; 这里ab,地址不同,但它们是自带类型,直接比较值,依然返回true)。

阅读(11087) | 评论(0) | 转发(1) |
1

上一篇:实习总结

下一篇:安装 deb

给主人留下些什么吧!~~