| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 727 人关注过本帖
标题:equals 和 == 的区别
只看楼主 加入收藏
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
收藏
 问题点数:0 回复次数:7 
equals 和 == 的区别

/*
* @(#) EqualSign2.java
*/


public class EqualSign2 {

public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
System.out.println("obj1 " + (obj1 == obj2 ? "==" : "!=") + " obj2");
System.out.println("obj1 " + (obj1.equals(obj2) ? "" : "not ") + "equals to obj2");

System.out.println();

String str1 = "abc";
String str2 = "abc";
System.out.println("str1 " + (str1 == str2 ? "==" : "!=") + " str2");
System.out.println("str1 " + (str1.equals(str2) ? "" : "not ") + "equals to str2");

System.out.println();

String strObj3 = new String("def");
String strObj4 = new String("def");
System.out.println("strObj3 " + (strObj3 == strObj4 ? "==" : "!=") + " strObj4");
System.out.println("strObj3 " + (strObj3.equals(strObj4) ? "" : "not ") + "equals to strObj4");

System.out.println();

System.exit(0);
}
}


[RUN]
obj1 != obj2
obj1 not equals to obj2

str1 == str2
str1 equals to str2

strObj3 != strObj4
strObj3 equals to strObj4

Press any key to continue . . .

问题:obj1,obj2 str1,str2 strObj3,strObj4 是否 == 、equals 都是根据什么判别的?

搜索更多相关主题的帖子: equals 
2006-12-05 16:20
阴阳妖瞳
Rank: 1
等 级:新手上路
帖 子:210
专家分:0
注 册:2006-12-5
收藏
得分:0 
首先
obj1 != obj2
这是因为JAVA在进行对象的比较的时候是对其引用所引的内存地址进行比较,很明显obj1和obj2两个引用分别指向不同的内存地址,所以他们不相等

同样的道理我们看strObj3和strObj4,他们也因为上述的原因导致了不相等的结果。

最关键的一点是字符串常量,需要声明的一点是,Java中为了更高效率的存取字符串,通常是在内存中开辟一个字符串常量池,把内容一样的字符串放在同一个内存单元中,这样可以极大的减少Java的内存开销。基于这样做的理由就是:Java规定:字符串不可变。

回头来看看str1和str2为什么相等,很明显,str1和str2同时指向字符串常量"abc",而字符串常量"abc"在内存的字符串常量池中只有一个内存地址,所以JVM一比较这两个引用所指向的地址都是同一个内存单元("abc"所在的常量池的地址),所以就判定str1和str2相等。


一身转战三千里,一剑曾挡百万师
2006-12-05 16:31
lyd8935
Rank: 1
等 级:新手上路
帖 子:219
专家分:0
注 册:2006-5-14
收藏
得分:0 
简而言之

== 是用来直接比较地址的(地址具有唯一值)
equals 是直接比较地址所指的值

String str1 = "abc";
String str2 = "abc";
因为没有申明引用( 如通过 new 来引用其它对象 ),即都是共用的String常量池内的地址, 即地址相同


2006-12-05 16:37
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
收藏
得分:0 
== : 用来比较引用所指内存地址。
equals:equals看起来是用来比较对象的值是否相等,所以有strObj3.equals(strObj4)。但是obj1.equals(obj2)的值为假,他们的值是指什么?

我在大家热情的帮助下进步,谢谢你们!
2006-12-05 16:41
阴阳妖瞳
Rank: 1
等 级:新手上路
帖 子:210
专家分:0
注 册:2006-12-5
收藏
得分:0 
equals方法如果不被子类重写, 那么它就等价于
public boolean equals( Object o ){
return this == o;
}

一身转战三千里,一剑曾挡百万师
2006-12-05 16:46
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
收藏
得分:0 

一个新问题,equals是以什么作为判断标准的?


我在大家热情的帮助下进步,谢谢你们!
2006-12-05 16:47
liugy52
Rank: 1
等 级:新手上路
帖 子:89
专家分:0
注 册:2006-10-1
收藏
得分:0 
那么就是说,equals的判别标准在于语义上的规定。

我在大家热情的帮助下进步,谢谢你们!
2006-12-05 16:50
阴阳妖瞳
Rank: 1
等 级:新手上路
帖 子:210
专家分:0
注 册:2006-12-5
收藏
得分:0 
恩~~同样的东西还有hashCode,你在处理集合类的时候就会碰到

一身转战三千里,一剑曾挡百万师
2006-12-05 16:51
快速回复:equals 和 == 的区别
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022722 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved