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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马伍哲沂 高级黑马   /  2013-1-11 12:20  /  2242 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 E.sile 于 2013-1-11 14:03 编辑
  1. Person p1 = new Person("John",23);
  2. Person p2 = new Person("John",23);
  3. System.out.println((p1.name == p2.name)?"相等!":"不相等!");
复制代码
代码运行的结果是相等!在原来的示例代码里,这里用的是equals来比较的,但那天一好奇觉得好玩就换了下==,发现也可以。
但不知道为什么,而且结果是相等。
于是,又联想到一个之前不懂的问题。为什么说String str = new String("java");是创建了两个对象,
这两个对象在内存中的什么地方?
求指教,谢谢。

6 个回复

倒序浏览
p1.name == p2.name,相等是因为,这两个对象的name属性都指向同一个对象:这个对象就是字符串常量池的常量字符串“John”,这个字符串在常量池只有一份。自然是相等的。
第二个问题不回答了。论坛这样的帖子太多了。
回复 使用道具 举报
舒远 发表于 2013-1-11 12:24
p1.name == p2.name,相等是因为,这两个对象的name属性都指向同一个对象:这个对象就是字符串常量池的常量 ...

谢谢。  那我这么理解对不对: 实际这两个问题也就是一个问题,后面这个问题中创建了两个对象  其中一个是在常量池,还一个是new的另外一片空间。

评分

参与人数 1黑马币 +15 收起 理由
舒远 + 15 加金币鼓励一下!

查看全部评分

回复 使用道具 举报
E.sile 发表于 2013-1-11 12:35
谢谢。  那我这么理解对不对: 实际这两个问题也就是一个问题,后面这个问题中创建了两个对象  其中一个 ...

very good!你说对了。。这就是一个问题。关于字符串对象在内存中的分配情况!
其中一个是在常量池,还一个是在堆内存中的。
回复 使用道具 举报
张老师关于这方面的回答
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用
==操作符。
     如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
     equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
     String a=new String("foo");
     String b=new String("foo");
     两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即ab中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true
字符串的比较基本上都是使用equals方法。
     如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:

     boolean equals(Object o){

     return this==o;

}

     这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
回复 使用道具 举报
何伟 发表于 2013-1-11 21:58
张老师关于这方面的回答
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所 ...

先谢谢同学的热心解答。

不过这个问题,我题目起的有点问题,题目问的是equal与==,但代码和提问的实质是String str = "java";与String str = new String("java");的区别。
回复 使用道具 举报
E.sile 发表于 2013-1-12 09:56
先谢谢同学的热心解答。

不过这个问题,我题目起的有点问题,题目问的是equal与==,但代码和提问的实质 ...

我说说我的看法,String str = “Java”是把常量Java 赋值给变量str 对象只有一个,这个没问题吧!存储位置在常量池

String str = new String("Java"); 首先是new了一个对象String  名称Str  位置在堆内存中! 然后给String传了值Java 在常量池中!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马