Java中“==”和equals的比较

孟祥月 2011-09-25 08:03:16
在Java中,boolean、byte、short、int、long、char、float、double这八种是基本数据类型,其余的都是引用类型。
“==”是比较两个变量的值是否相等,“equals”是比较两个对象变量所代表的对象的内容是否相等。
例如下面的代码
public static void main(Strint[] args)
{
String str1=new String("abc");
String str2=new String("abc");
if(str1==str2)
{
System.out.println("str1==str2");
}
else
{
System.out.println("str1!=str2");
}
}
可能我们都会以为输出的应该是str1==str2,但是结果却是str1!=str2。这个并不是我们想要的,那么为什么会出现这样的情况的呢,我们仔细想想,在java中不存在指针,存在的只是引用,当我们使用String str1 的时候他并没有创建什么对象,只是在栈内存上开辟了一个空间,用于存放str1我存储的东西,当然我们没有使用new String之前,在str1的空间里的值是NULL。只有当我们调用了new String之后才会真正的在堆内存上去创建str1这个对象的实体。这时候在栈内存中的str1存储的是str1在堆中实体对象的首地址。同样str2也是执行同样的操做。可能还是不懂,下面看一张图片,大家就应该明白了。


当我们执行上面的代码的时候,str1和str2存储的分别是str1和str2的实体对象的首地址,并不是对象本身,所以输出的结果才是str1!=str2。
下面我们来修改一下上面的代码
public static void main(String[] args)
{
String str1=new String("abc");
String str2=new String("abc");
String str3=str1;
if(str1==str2)
{
System.out.println("str1==str2");
}
else
{
System.out.println("str1!=str2");
}
if(str1==str3)
{
System.out.println("str1==str3");
}
else
{
System.out.println("str1!=str3");
}
}
上面的代码我们创建了一个String对象str3,并将str1负值给str3,这样按照上面的那张图片,str3存储的应该是和str1一样的地址,所以我想大家就知道输出的结果了,str1==str3。
可是我们很多时候想做的并不是这个比较,我们想做的是比较两个对象的值是否相等,我们可以使用Object类中的equals()方法。由于在java中规定所有的类都是Object所以也就会继承这个方法,但是在String类中,String类重写了这个方法,在java帮助文档中给出了如下的描述:
equals
public boolean equals(Object anObject)
将此字符串与指定的对象比较。当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为true。
覆盖:
类 Object 中的 equals
参数:
anObject - 与此 String 进行比较的对象。
返回:
如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回false。
我们可以调用String的类的equals()方法传递一个我们想要比较的对象,我们按照这个将程序改成如下:
public static void main(String[] args)
{
String str1=new String("abc");
String str2=new String("abc");
if(str1.equals(str2))
{
System.out.println("str1 equals str2");
}
else
{
System.out.println("str1 not equals str2");
}
}
程序的输出结果是str1 equals str2。最后在总结一下:当我们声明一个引用类型变量时,系统只为该变量分配了引用空间,并未创建
一个具体的对象;当用new为对象分配空间后,将对象的引用赋值给引用变量。当我比较两个对象的引用的时候,比较只是对象的首地址,只有调用equals()方法的时候我们才能用于比较两个对象的值。
...全文
236 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
孟祥月 2011-10-15
  • 打赏
  • 举报
回复
我又怎么了啊
zuinie2008 2011-10-15
  • 打赏
  • 举报
回复
楼主太霸道了啊
lliiqiang 2011-09-26
  • 打赏
  • 举报
回复
new String()构造方法肯定是产生了一个新的字符串对象,和普通的其他类构造方法一样
IterZebra 2011-09-26
  • 打赏
  • 举报
回复
http://blog.csdn.net/iterzebra/article/details/6757681
IterZebra 2011-09-26
  • 打赏
  • 举报
回复
http://blog.csdn.net/iterzebra/article/details/6757681
24K純帥 2011-09-26
  • 打赏
  • 举报
回复
喔..
yaming116 2011-09-26
  • 打赏
  • 举报
回复
引用---作者:风中叶(张龙)
1.equals()方法,该方法定义在Object 类当中,因此Java 中的每个类都具有该方法,
对于Object 类的equals()方法来说,它是判断调用equals()方法的引用与传进来的引
用是否一致,即这两个引用是否指向的是同一个对象。对于Object 类的equals()方
法来说,它等价于==。
2. 对于String 类的equals()方法来说,它是判断当前字符串与传进来的字符串的内容
是否一致。
3. 对于String 对象的相等性判断来说,请使用equals()方法,而不要使用==。
4. String 是常量,其对象一旦创建完毕就无法改变。当使用+拼接字符串时,会生成新
的String 对象,而不是向原有的String 对象追加内容。
5. String Pool (字符串池)
6. String s = “aaa”; (采用字面值方式赋值)
1) 查找String Pool 中是否存在“aaa”这个对象,如果不存在,则在String Pool 中创建
一个“aaa”对象,然后将String Pool 中的这个“aaa”对象的地址返回来,赋给引
用变量s,这样s 会指向String Pool 中的这个“aaa”字符串对象
2) 如果存在,则不创建任何对象,直接将String Pool 中的这个“aaa”对象地址返回来,
赋给s 引用。
7. String s = new String(“aaa”);
1) 首先在String Pool 中查找有没有“aaa”这个字符串对象,如果有,则不在String Pool
中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对
象,然后将堆中的这个“aaa”对象的地址返回来,赋给s 引用,导致s 指向了堆中
创建的这个“aaa”字符串对象。
2) 如果没有,则首先在String Pool 中创建一个“aaa “对象,然后再在堆中(heap)创
建一个”aaa “对象,然后将堆中的这个”aaa “对象的地址返回来,赋给s 引用,
导致s 指向了堆中所创建的这个”aaa “对象。
wei15273000140 2011-09-25
  • 打赏
  • 举报
回复
很好。对于我们刚入门者来说还是有帮助
huawumingguo 2011-09-25
  • 打赏
  • 举报
回复
LZ..为什么用首地址这样的说法,直接说内存不就OK了,以为指针啊..

听到通常的说法是==是对内存的比较,所以,new了两个就是两个不同的内存地址
而equals是object的方法,string里面重写了,是针对string类的,假设你写了一个person类当model,你也要对equals重写,不然,两个资料完全一样的person,但new了两个,它们也是不等的..
可以说,equal是数据上的相等就相等,==是内存一样才相等.

一般不要用string类来做这个例子好点.因为string类被处理过了.下面这段会显示==,
String ab = "lkj";
String abc = "lkj";
if(ab==abc){
System.out.println("==");
}else{
System.out.println("!=");
}
yeliguo12345 2011-09-25
  • 打赏
  • 举报
回复
都被你们说完了,接分走人
lybjshy 2011-09-25
  • 打赏
  • 举报
回复
5235235235
bolink5 2011-09-25
  • 打赏
  • 举报
回复
老问题了 一个是值比较 一个是地址的比较
孟祥月 2011-09-25
  • 打赏
  • 举报
回复
很简练,说的也对,但是也有特殊情况。比如下面的程序
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
str1和str2是相等的 这个里面有堆和栈的问题 我是新学java的谢谢你的总结
江郎才近 2011-09-25
  • 打赏
  • 举报
回复
总之记住一点,对于基本数据类型的比较就用==,而对于封装过的类型就用equals方法就行了。
hulalaha 2011-09-25
  • 打赏
  • 举报
回复
哦 具体书上都有
凌风雪雕 2011-09-25
  • 打赏
  • 举报
回复
接分吧 飘过
xgrsb2005 2011-09-25
  • 打赏
  • 举报
回复
教程贴,谢谢楼主,虽然我知道
孟祥月 2011-09-25
  • 打赏
  • 举报
回复
算不上吧 因为自己也是在学 只是自己学的时候感觉应该记下来 记下来了 希望对被人有帮助 所以就发出来了
xubingok 2011-09-25
  • 打赏
  • 举报
回复
你这发的是教程贴吗?
fendoudxiaohouzi 2011-09-25
  • 打赏
  • 举报
回复
一个是值在进行比较,,一个是地址在比较
加载更多回复(3)

62,614

社区成员

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

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