码迷,mamicode.com
首页 > 编程语言 > 详细

java equals()和 ‘==’,‘!=’的使用和易错点

时间:2017-08-24 15:33:06      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:src   变量   images   父类   技术   public   内存   int   一个   

 

 

        关系操作符==和!=使用于所有对象的比较,返回boolean值,这两个操作符常常会使第一次接触java的程序员感到迷惑。下面是一个例子           

public class EqualsTest {
public static void main(String[] args) {
Integer in1 = new Integer(100);
Integer in2 = new Integer(100);
System.out.println(in1==in2);
System.out.println(in1!=in2);
}
}

 

        语句System.out.println(n1==n2)将打印出括号内的比较式的布尔值结果。读者可能认为输出结果先是true,再是false,因为两个Integer对象都是相同的。但是尽管对象的内容相同,然而对象的引用(每new一个对象就是一个引用)却是不同的,而==和!=比较的就是对象的引用。所有输出结果实际先是false,再是true。其实这里主要是理解==这个操作关系符就够了。

  谈到 == 关系操作符我们肯定会想到equals()方法,再看下下面的例子:

public class EqualsTest {

public static void main(String[] args) {
Integer in1 = new Integer(100);
Integer in2 = new Integer(100);
System.out.println(in1.equals(in2));
}
}
这里输出的结果是true。问题来了,到这里我们是否能够得到这样的结论:

  ‘==’ 关系操作符比较的是对象的引用,而 equals() 比较的是对象的实际内容。

先别急着下结论,我们再看看下面的例子:public class EqualsTest {

public static void main(String[] args) {
Value v1 = new Value(100);
Value v2 = new Value(100);
System.out.println("v1.equals(v2)? "+v1.equals(v2));
}
}
class Value{
int i;
public Value(int i){
this.i = i;
}
}
出乎意料的这里的输出实际结果为false,这就让人难以理解了啊!说明上面的结论不正确了啊,这样的话这个equals()就有点坑爹了啊。为了搞清楚这个问题,下面我们来追踪下equals()这个方法。
  
首先我们得先明白这个equals是哪来的,由上面的代码我们可以看到Value这个对象压根就没有equals()方法,那么equals从哪里呢?
    如果在创建类的时候没有声明要继承的类,那么java就默认把它继承Object类。所以Object就是所有类的父类。

这样我们就明白了equals()来自Value类的父类Object,下面我们来看下Object的equals()这个方法:
  技术分享
从上面的代码可以看出Object的equals方法比较的是对象的引用而不是对象的实际内容,这时我们的一个疑问是:
    
    为什么Integer的equals()方法比较的是对象的实际内容?

为了解答这个问题,我们来看看Integer类的原码:
  技术分享
  技术分享
技术分享
技术分享
   通过上面四张截图我们就知道了,Integer已经覆盖了Object的equals()方法,使得Interger的equals()方法比较的是对象的实际内容值(int value)。
  
  现在我把Value也重写下equals()方法,代码如下:
public class EqualsTest {
    public static void main(String[] args) {
Value v1 = new Value(100);
Value v2 = new Value(100);
System.out.println(v1.equals(v2));
}
}
class Value{
int i;
public int getValue(){
return i;
}
public Value(){
}
public Value(int i){
this.i = i;
}
public boolean equals(Object obj){
if(obj instanceof Value){
return i ==((Value) obj).getValue();
}
return false;
}
}
  这时输出的结果就是我们想要的结果:true。
  
这时我们就可以得出结论:
      ‘==’ 关系操作符比较的是对象的引用,而Object类的equals()比较的也是对象的引用,如果想要比较对象的实际内容可以覆盖父类
(Object)的equals()方法,eg:java JDK 自带的类:Integer,String等。
  
  注:
    当Integer i的值在 [-128,128) 的范围内是,java就会把变量i当做一个变量,放到内存中;但如果不在这个范围内,就会去new一个Integer对象,
  所以当Ingeter值在 [-128,128)的范围内时,‘==’比较的是对象的实际内容值,既变量的值而不是比较引用。

这是本人的第一篇博客,写的不好,也可能有写得不对的地方,请各位读者能给出宝贵的意见,本人写博客是为了加深对一些东西印象和理解。

2017/8/23




  

 

 

 

 

 

java equals()和 ‘==’,‘!=’的使用和易错点

标签:src   变量   images   父类   技术   public   内存   int   一个   

原文地址:http://www.cnblogs.com/czeke/p/7418929.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!