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

关系操作符==和!=使用于所有对象的比较,返回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    

  
 
 
时间: 2024-08-27 21:34:36

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

Java equals和toString用法

1.代码 User.java public class User{ String name; int age; public User(String name,int age){ this.name = name; this.age = age; } public boolean equals(Object obj){ if(this == obj) return true; boolean b = obj instanceof User; if(b){ User u = (User)obj;

java equals函数

java中所有类都是Object的子类,Object中实现了equals方法,使用时一般要对其进行重载. 不进行重载时 public class JavaTest { public static void main(String[] args) { boolean result; Student stu1=new Student("cjc",24); Student stu2=new Student("cjc",24); result=stu1.equals(stu

java equals()用法错误解析

if (!password2.equals(password1)|| "".equals(password1) || password1.equals(null))一句的错误解析: 首先,正确的写法是if (null.equals(password1) || "".equals(password1) || !password1.equals(password2)). 然后来解析错误的写法: 主要的错误在password1.equals(null)这一句,这一句错的原

java equals和==的区别

大概说equals和==都比较的是什么: 1. boolean tem = a == b; 首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容.因为栈是用来存放地址或是java中八大基本类型中自动变量的字面值(自动变量就是用int a = 1;这种形式来定义的变量).如果是自动变量比较值的话肯定是用==来比较,因为equals()是一个方法,所以必须由对象调用才可以用于比较.而自动变量既不是类的实例也不是类的引用所以不能用equals()方法. 2.boolean tem

Java ==,equals,hashCode,解析(适合初学者阅读)

1.对于equals()和hashCade()方法他们都是位于Java.lang.object类下的方法,又因为所有的类都继承于objct类,所以所有的类都可以使用这两个方法. 2.对于equals()方法,首先知道他是用于比较的,这里我吧源码打出来(注意:我这打出的源码是Object类中的equals()方法的源码) public boolean equals(Object obj){ return (this==obj); } 附录:this关键字我在这里进行简单的说明一下吧,对于初学者对t

重写java equals 方法的建议

@Overridepublic boolean equals(Object otherObject) { //1.检测this 与 otherObject 是否引用同一个对象 if (this == otherObject) return true; //2.检测otherObject 是否为null, 如果为null,返回false if (null == otherObject) return false; //3.比较this 与 ohterObject 是否属于同一个类 if(getCl

Java equals方法详解

Java的Object类中定义了equals方法,Object类中的equals方法源代码如下,从源代码中可以看出Object类中的equals方法是用来返回判断两个对象是否指向同一个地址 public boolean equals(Object obj) { return (this == obj); } Ojbect类中的equals方法会被子类重写,例如String会重写equals方法,String的equals方法源代码如下, public boolean equals(Object

java equals 和 "==" 比较

java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个

Java == ,equals 和 hashcode 的区别和联系

1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: public class ComAddr{ public static void main(String[] args) throws Exception { String s1 = "nihao"; String s2 = "nihao"; String s3 = new String("nihao"); System.out.println(s1 ==