【零碎JAVA】java中对象比较,equals与==的区别

在java中,我们通常使用==或者equlas去判断两个变量是否相等。

1.==

    当判断两个基本数据类型(int,long...)的是否相等的时候,不需要两个变量数据类型相同,只要值相等就返回true。

    eg:

        int i = 65;
        float f = 65.0f;
        char c = 'A';
        System.out.println(i == f);
        System.out.println(i == c);
        System.out.println(c == f);

        他们的返回值都为true

    当两个引用类型的变量,使用==进行比较的时候,两个变量必须指向同一个对象时才返回true

    eg:

        Person p = new Person("孙悟空");
        Person p2 = p;
        System.out.println(p == p2);    //此时返回true

        Person p1 = new Person("hello java");

        Person p2 = new Person("hello java");

        System.out.println(p1 == p2);    //此时返回false,因为在堆中new了两个Person对象,即使他们的值都为hello java,但是他们的内存地址不一样。

 

2.equals

    基本数据类型不能通过equals方法来进行比较,equals方法是Object中的一个方法,必须通过引用变量来调用。

    String str1 = new String("hello java");
    String str2 = new String("hello java");
    System.out.println(str1 == str2);        //false
    System.out.println(str1.equals(str2));//true

    上学的时候大家肯定都看过这样的代码,当时的理解是equals是比较变量的值,现在发现这个是错误的,String类中重写了equals方法,使他在这种情况下根据值判断返回了true,实际上equals如何判断,都掌握在自己手里面,此处的String自己封装好了,是一个特殊的例子。

一般我们重写equals方法会这么写:

    public boolean equals(Object obj){
        if(obj != null && obj instanceof Person){
            Person p = (Person)obj;
            //根据特定的属性判断,此处假设存在年龄这个属性
            if(this.getAge() == p.getAge())
                return true;
        }
        return false;
   }

但是此处存在一点问题,主要是instanceof,当instanceof前面的对象是instanceof后面类的实例,或者子类实例时,都返回true,这就会带来一些问题。

下面提供一段比较好的重写equals的代码:

public boolean equals(Object obj){
  //当equals前后是同一对象的时候,返回true
  if(this == obj)
   return true;
  if(obj != null && obj.getClass() == Person.class){
   Person p = (Person)obj;
   //根据特定的属性判断,此处假设存在年龄这个属性
   if(this.getAge() == p.getAge())
    return true;
  }
  return false;
 }

这里面用到了java反射里面的知识。

          

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章