java中equals()方法和==比较

danwell7 2012-04-13 08:49:00
Object中的equals()方法默认是按地址比较,而不按内容进行比较。
这和关系运算符“==”在进行对象比较时没有区别了,但是经常说==两边
对象是按地址在比较,而equals()是按内容在比较,这是怎么回事???


像String s1="回家了";
String s2="回家了";
s1.equals(s2),返回值是true

String s1=new String("回家了")
String s2=new String("回家了")
s1.equals(s2),返回值是false
这个有该怎么解释???
...全文
3313 51 打赏 收藏 转发到动态 举报
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouyang209117 2012-04-23
  • 打赏
  • 举报
回复
为什么我测试的是两个都返回true?
踏月 2012-04-23
  • 打赏
  • 举报
回复
LZ,你的第二个不可能是false,首先我来帮你解释下:
第一:一个类如果没有重写equals()方法的话,比较的就是对象的地址(因为Object中默认比较的是地址)。这个和== 没有任何区别。
第二: 你的第二个也应该是true,为什么呢? 因为String 重写了equals方法了。你可以打开JDK 的源代码看看,String 类中 的equels比较的是内容。不是地址。
浅笑123 2012-04-20
  • 打赏
  • 举报
回复
~了解下
浅笑123 2012-04-20
  • 打赏
  • 举报
回复
JDK文档
equals
public boolean equals(Object anObject)比较此字符串与指定的对象。当且仅当该参数不为 null,并且是表示与此对象相同的字符序列的 String 对象时,结果才为 true。

有空的时候,去看下JDK文档
ft305757 2012-04-19
  • 打赏
  • 举报
回复
a418355552 2012-04-17
  • 打赏
  • 举报
回复
package same;

public class test
{
public boolean equals(Object anObject)
{
if(this==anObject)
{
return true;
}
if(anObject instanceof String)
{
String anotherString=(String)anObject;
int n=count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}


}
能运行吗?
a418355552 2012-04-17
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

Java code

public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
……
[/Quote]package same;

public class test
{
public boolean equals(Object anObject)
{
if(this==anObject)
{
return true;
}
if(anObject instanceof String)
{
String anotherString=(String)anObject;
int n=count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}


}
jueshengtianya 2012-04-17
  • 打赏
  • 举报
回复
在object类中 equals方法就是使用 == 做比较的,
而所有类都是继承object类,
但是有的类却覆盖了object类的equals方法,使用自己的实现方式,比如String覆盖的equals方法,实现了内容的比较
tongkang 2012-04-16
  • 打赏
  • 举报
回复
第一种是在StringPool中,同一个字符串,只比较字符串内容,
第二个是不同的String对象,要比较HashCode的值,还有字符串内容的。
evang_shot 2012-04-16
  • 打赏
  • 举报
回复
这问题看看源码就知道了。
tl2327 2012-04-16
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

理解上有误区了。
String重写了equals方法,重写代码如9楼
String s1 = "回家了";
这句话执行时,首先在栈中新建s1引用变量,在常量池而非堆中新建一个“回家了”的引用对象
String s2 = "回家了";
这句话执行时,首先在栈中新建s2引用变量,由于之前的常量池中有“回家了”这里就不新建了。
所以无论==还是equals都相等
-----------……
[/Quote]
20正解!!!已经解释的很清楚了~~~~~~
meichen8050753 2012-04-16
  • 打赏
  • 举报
回复
但是String 中的equals是经过重写的,先比较2个是否是同一个对象,如果是则返回true,如果不是则比较2个字符串的值,如果值相同则返回true,否则返回false
meichen8050753 2012-04-16
  • 打赏
  • 举报
回复
字符串直接赋值是在栈中,赋值开始时,会先查找栈中是否有这个字符串,如果有,则指向这个字符串,如果没有则新建一个。
当String s1="回家了";时, 栈中没有这个字符串,所以会在栈中新建一个,再把s1指向栈中的"回家了"。
当String s2="回家了";时, 栈中已经有了这么一个字符串,就把s2指向栈中的"回家了"。
所以s2其实和s1指向的都是同一个字符串。

当每次new创建字符串的时候,会再堆中创建一个字符串对象,再在栈中创建这个字符串的引用。
所以s3和s4分别是2个对象的应用,所以返回false
回眸婉约 2012-04-16
  • 打赏
  • 举报
回复
两个对象肯定不一样
iswift.cloud 2012-04-16
  • 打赏
  • 举报
回复
补充一下吧,比较的是 hashCode值,对于string hashCode只和值有关系,和其他没有任何关系的!也就是只要值一样,string的hashCode一定相同,可以看看jdk里的String!
iswift.cloud 2012-04-16
  • 打赏
  • 举报
回复
你们这……
都是true!
古市轩 2012-04-13
  • 打赏
  • 举报
回复
String str1 = "回家了";
执行这句时,首先到String pool里面去找,发现没有,就把"回家了"这个对象放到String pool里面,并返回string pool 中这个对象的地址赋给str1;

String str2 = "回家了";
执行这句时,也是首先到String pool里面去找,发现对象"回家了"已经存在,就直接返回地址并赋给str2;

String str3 = new String("回家了");
执行这句时,首先到String pool里面去看"回家了"这个对象在不在,如果不存在,那么就在String pool中创建这个对象,然后在堆中创建对象"回家了"(不管堆中存不存在都创建),并把堆中这个对象的地址返回赋给str3;如果存在,就直接在堆中创建这个对象,并将地址返回赋给str3;(总之用了new关键字,返回的就是堆中的地址)。

String str4 = new String("回家了");
执行这句时,跟执行上一句(str3)是一样的。

所以:
str1 == str2 --->true
str1.equals(str2) --->true
str3 == str4 --->false
str3.equals(str4) --->true

执行equals方法时,首先用 == 判断,如果返回true,就直接返回true,如果返回false,再进一步比较这连个对象的内容。这里可以看equals的源代码,源码面前,了无秘密!
夜子 2012-04-13
  • 打赏
  • 举报
回复
第二个 如果是 s1==s2 那就是false 因为new 出来的东西 放在堆内存里面 并且不是同一对象 所以是false
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

我昨天也在为这个问题困惑 后来请教老师 得到的答案是
这个跟堆栈有关系 一个是直接指向的内存空间 另一个是相当于指针
但是由于现在的虚拟机机制 导致这两种方法现在在分配上已经是一样的

额 差不多就是这样

但是我回来调试 结果确实是一个true 一个false
难道这个还跟运行环境有关?
[/Quote]

不会有楼主的情况。

2个都是true ,按楼主的意思写的话。
Sprite 2012-04-13
  • 打赏
  • 举报
回复
我昨天也在为这个问题困惑 后来请教老师 得到的答案是
这个跟堆栈有关系 一个是直接指向的内存空间 另一个是相当于指针
但是由于现在的虚拟机机制 导致这两种方法现在在分配上已经是一样的

额 差不多就是这样

但是我回来调试 结果确实是一个true 一个false
难道这个还跟运行环境有关?
加载更多回复(30)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧