设为首页收藏本站订阅更新

无忧脚本

 找回密码
 加入无忧

QQ登录

只需一步,快速开始

搜索
查看: 16307|回复: 13

编程讨论--在String中==和equals的区别

[复制链接]
发表于 2006-7-14 11:55:15 | 显示全部楼层 |阅读模式
  刚刚看到论坛上有人要求讲下这个点,所以找出了一个例子,原先是别人发布在JR上的,觉得能让人比较直观的理解这方面的概念,所以这里转一下。在这个地方还不清楚坛友可以运行下,再想一想,应该就会很容易明白的。要是还不懂就下面跟贴,咱们再一起讨论讨论。

下面是源代码(存为Java文件,编译运行,推敲下结果):


public class DosShell {

    public static void main(String[] args) {
        // 开始测试了。
        System.out.println("Hello world");
        //定义两个对象,并初始化。
        String c = "Check equal method";
        String d ="Check ";
        //这样d 和 c是一样的麽?
        d += "equal method";
        System.out.println("c.equals(d)的结果并不表示c和d到底是不是引用的一个对象,因为它被重载了.结果:"+ (c.equals(d)));   
        System.out.println("c==d的结果表示c和d到底是不是引用的一个对象.结果:"+ (c==d));   
      //intern方法是干什么的呢?原来是返回 常量池 中的常量的引用(如果没有就创建一个)。那么下面的结果是什么呢?
        System.out.println("use intern method c==c.intern()-->" + (c==c.intern()));
        System.out.println("use intern method d==c.intern()-->" + (d==c.intern()));
        System.out.println("use intern method c==d.intern()-->" + (c==d.intern()));
        System.out.println("use intern method d==d.intern()-->" + (d==d.intern()));
        //原来c直接是引用的常量池中,而d不是。难怪c!=d;
        
    //下面这个简单
        String s1 = "123";
        String s2 = "345";
        System.out.println("String s1 = \"123\";String s2 = \"345\"");
        System.out.println("s1==s2: " + (s1==s2));
        System.out.println("s1.equals(s2): " + s1.equals(s2));
        System.out.println("s1.hashCode()==s2.hashCode():" + (s1.hashCode()==s2.hashCode()));
        //让s2的引用变一下
        s2 = "123";
        System.out.println("s2 = \"123\";");
        System.out.println("s1==s2: " + (s1==s2));
        System.out.println("s1.equals(s2): " + s1.equals(s2));
        System.out.println("s1.hashCode()==s2.hashCode():" + (s1.hashCode()==s2.hashCode()));
        //原来都是true,都是引用的常量池,如果这样呢?
        s2 = new  String("123");
        System.out.println("s2 = new  String(\"123\");");
        System.out.println("s1==s2: " + (s1==s2));
        System.out.println("s1.equals(s2): " + s1.equals(s2));
        System.out.println("s1.hashCode()==s2.hashCode():" + (s1.hashCode()==s2.hashCode()));
        //new 方法在堆中创建了一个新的对象,而s2引用了它,不再是原来引用的常量池了。
        
        //看看这个结果        
        s2 = new String();
        System.out.println(s2);
        //这个语句相当于s2 = new String("");和下面的不一样。        
        String s3 = null;
        System.out.println(s3);
        //再来看看intern方法,说明了什么??
        String s4 = new String();
        System.out.println("use intern method s4==s4.intern()-->" + (s4==s4.intern()));
        //new 在堆创建了了个""对象,当然和常量池的""不一样了啊。   

    }
}
发表于 2006-8-26 17:08:29 | 显示全部楼层
==    比内存地址
equals 比值
发表于 2006-12-3 09:32:00 | 显示全部楼层
嗯,同意楼上的。。
发表于 2007-6-30 14:39:19 | 显示全部楼层
原帖由 阿痕 于 2006-8-26 17:08 发表
==    比内存地址
equals 比值

同意
发表于 2007-8-14 10:36:12 | 显示全部楼层
equals是用于字符串比值,==不能用于字符串比值
发表于 2007-11-15 17:41:00 | 显示全部楼层
同意
发表于 2008-1-8 16:31:15 | 显示全部楼层
原帖由 阿痕 于 2006-8-26 17:08 发表
==    比内存地址
equals 比值


同意
发表于 2008-1-13 16:31:25 | 显示全部楼层
原帖由 阿痕 于 2006-8-26 17:08 发表
==    比内存地址
equals 比值

同意这个观点,老师都是这么教的:loveliness:
发表于 2008-8-1 09:16:18 | 显示全部楼层
原帖由 [I]hanhan[/I] 于 2007-8-14 10:36 发表
equals是用于字符串比值,==不能用于字符串比值


--你这个观点不完全正确,equals不只是用于字符串比值,应该是像上面兄弟说的,是比较内存的值。
发表于 2009-5-9 01:26:14 | 显示全部楼层
java这么奇怪?
intA == 0
这个是不是不能比?
发表于 2012-4-15 11:42:01 | 显示全部楼层
equals  bi jiao de shi hashcode() de zhi!
您需要登录后才可以回帖 登录 | 加入无忧

本版积分规则

小黑屋|手机版|Archiver|无忧脚本 ( 苏ICP备05080427号 )|值班电话:027-62300445   鄂公网安备 42011102000433号

GMT+8, 2017-12-13 13:15 , Processed in 0.095360 second(s), 8 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表