MyException - 我的异常网
当前位置:我的异常网» J2SE » Java中“==”和equals的比较,该如何处理

Java中“==”和equals的比较,该如何处理

www.MyException.Cn  网友分享于:2013-01-10  浏览:26次
Java中“==”和equals的比较
在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()方法的时候我们才能用于比较两个对象的值。

------解决方案--------------------
总之记住一点,对于基本数据类型的比较就用==,而对于封装过的类型就用equals方法就行了。
------解决方案--------------------
老问题了 一个是值比较 一个是地址的比较
------解决方案--------------------
5235235235
------解决方案--------------------
都被你们说完了,接分走人
------解决方案--------------------
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("!=");
}
------解决方案--------------------
很好。对于我们刚入门者来说还是有帮助

文章评论

总结2014中国互联网十大段子
总结2014中国互联网十大段子
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员和编码员之间的区别
程序员和编码员之间的区别
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
鲜为人知的编程真相
鲜为人知的编程真相
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员的鄙视链
程序员的鄙视链
一个程序员的时间管理
一个程序员的时间管理
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
那些争议最大的编程观点
那些争议最大的编程观点
老程序员的下场
老程序员的下场
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
如何成为一名黑客
如何成为一名黑客
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
代码女神横空出世
代码女神横空出世
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
中美印日四国程序员比较
中美印日四国程序员比较
 程序员的样子
程序员的样子
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
Java程序员必看电影
Java程序员必看电影
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
编程语言是女人
编程语言是女人
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
我的丈夫是个程序员
我的丈夫是个程序员
旅行,写作,编程
旅行,写作,编程
程序员都该阅读的书
程序员都该阅读的书
10个调试和排错的小建议
10个调试和排错的小建议
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
漫画:程序员的工作
漫画:程序员的工作
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员应该关注的一些事儿
程序员应该关注的一些事儿
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
为什么程序员都是夜猫子
为什么程序员都是夜猫子
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有