A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周志伟 黑马帝   /  2013-4-5 00:06  /  2068 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 周志伟 于 2013-4-5 22:19 编辑

明明字符串c和d内容都一样,为何还打印的是:c != d呢??
  1. class StringDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String a = "my";
  6.                 String b = "name";
  7.                 String c = a + b;
  8.                 String d = "myname";

  9.                 if(c == d)
  10.                         System.out.println("c==d");
  11.                 else
  12.                         System.out.println("c!=d");
  13.         }
  14. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

17 个回复

倒序浏览
字符串用==比较,是比较两个字符串是不是指向同一个对象。
程序在运行的时候会创建一个字符串缓冲池,程序会把字符串常量放入字符串缓冲池中
                String a = "my";
                String b = "name";
                String c = a + b;
                String d = "myname";
这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象
在这些赋值中,涉及到变量运算,所以得到的字符串对象存储在各自的内存中,不是缓冲池中的对象

在字符串中 每个字符串都是一个对象。  所以c和d是两个不同的对象, 所以 c!=d.....

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 孙百鑫 于 2013-4-5 00:54 编辑

class StringDemo
{

        public static void main(String[] args)
        {

                String a = "my";

                String b = "name";

                String c = a + b;

                String d = "myname";


                if(c.equals(d))//这个是修改后的.equals是比较c和d是否相等

                                //if(c.hashCode()==d.hashCode())//这个是比较哈希吗是否相等


                                //if(c==d)这个是比较在内存中c和d的内存地址值是否相同,之所以c!=d是因为每次创建的内存地址都是不一样的.所以才不同

                        System.out.println("c==d");

                else

                        System.out.println("c!=d");

        }

}
//希望对你有帮助,
回复 使用道具 举报
  1. class StringDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String a = "my";
  6.                 String b = "name";
  7.                 String c = a + b;
  8.                 String d = "myname";

  9.                 if(c == d)  
  10.                         System.out.println("c==d");   
  11.                 else
  12.                         System.out.println("c!=d");
  13.         }
  14. }
复制代码
你里面的c==d比较的是c和d在内存中的地址值,这两个刚开始的时候都会在常量池中生成这两个常量,然后把这两个常量的地址值赋给c和d,c,d这两个地址是不一样的因此肯定不一样的,这是字符串的一个特性,不像数字那样直接比较的是大小,如果要比较字符串的具体内容,就要用到equals    也就是c.equals(d)
回复 使用道具 举报
续圆凯 发表于 2013-4-5 00:17
字符串用==比较,是比较两个字符串是不是指向同一个对象。
程序在运行的时候会创建一个字符串缓冲池,程序会 ...

恩,有点明白了,再消化一下。谢谢啦
回复 使用道具 举报
许兵兵 发表于 2013-4-5 01:13
你里面的c==d比较的是c和d在内存中的地址值,这两个刚开始的时候都会在常量池中生成这两个常量,然后把这两个 ...

恩,有点明白了,再消化一下。谢谢啦
回复 使用道具 举报
孙百鑫 发表于 2013-4-5 00:52
class StringDemo
{

恩,有点明白了,再消化一下。谢谢啦
回复 使用道具 举报
他们必须不想等的...
你可以打印他们的identyHashCode();来判断他们的内存地址是否一样。。。
identyHashCode()返回对象在内存的唯一内存地址。
比HashCode()在string中是被复写的,只要两个串一样返回的hashCode()就一样了
回复 使用道具 举报
  1. class StringDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String a = "my";// a 在编辑时期就确定下来了,a在常量池中
  6.                 String b = "name";//b 和a一样
  7.                 String c = a + b;//编辑器无法在编辑时期确定c 变量,也就让其无法指向常量池
  8.                 String d = "myname";//c 和 a b 都一样都是在编辑时期确定下来的,所以也在常量池中

  9.                 if(c == d)
  10.                         System.out.println("c==d");
  11.                 else
  12.                         System.out.println("c!=d");
  13.         }
  14. }
复制代码
//这个内容在java疯狂讲义中讲的很清楚,好像是在final这一块讲的

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
==  比较的时内存中的hashcode 值,,每个对象分配的hashcode 都是不一样的,,在内存中hashcode 值 是唯一的,如果你用equals 比较的话,就是想等的,,因为equals 比较的是对象中的内容,,不知道 我这样说 是不是 说明白了
回复 使用道具 举报
董维明 发表于 2013-4-5 10:31
==  比较的时内存中的hashcode 值,,每个对象分配的hashcode 都是不一样的,,在内存中hashcode 值 是唯一 ...

我明白了,==比较的是地址,equals比较的是值,是这样的吧?
回复 使用道具 举报
似水像火 发表于 2013-4-5 08:30
//这个内容在java疯狂讲义中讲的很清楚,好像是在final这一块讲的

我明白了,==比较的是地址,equals比较的是值,是这样的吧?
回复 使用道具 举报
周志伟 发表于 2013-4-5 21:21
我明白了,==比较的是地址,equals比较的是值,是这样的吧?

对,,==比较的是对象在内存中分配的地址值,equals 比较的时对象中的内容
回复 使用道具 举报
董维明 发表于 2013-4-5 22:10
对,,==比较的是对象在内存中分配的地址值,equals 比较的时对象中的内容 ...

恩恩,明白了,谢谢啦。
回复 使用道具 举报
周志伟 发表于 2013-4-5 22:19
恩恩,明白了,谢谢啦。

不用客气,,您是自学呢吗?
回复 使用道具 举报
周志伟 发表于 2013-4-5 21:21
我明白了,==比较的是地址,equals比较的是值,是这样的吧?

是的,但是String类复写了hashCode(),只要两个字符串是一样的,返回的hashcode()就是相同的,可以查看String类的hashCode()源码
要想获取其唯一指定内存地址,建议使用identityHashCode()。
identityHashCode()返回变量在物理内存上的唯一地址。。
回复 使用道具 举报
董维明 发表于 2013-4-6 07:32
不用客气,,您是自学呢吗?

是啊,自己看毕老师的视频自学。
回复 使用道具 举报
似水像火 发表于 2013-4-6 10:01
是的,但是String类复写了hashCode(),只要两个字符串是一样的,返回的hashcode()就是相同的,可以查看St ...

额,您说的这部分我还没有看到啊。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马