面试题解析:3 java中 == 和 equals的区别

时间:2022-04-25 16:18:19

==:

1.如果比较的是两个普通的变量,那么 比较的是两个变量的值是否相等。

int a = 3 ; 
int b = 3 ;
System.out.println(a == b);

2.如果是对象类型的变量,那么比较的是两个对象变量中存的引用的地址是否相同,显然 obj1 和 obj2 指向的对象不是同一个对象。

Object obj1 = new Object();
Object obj2 = new Object();

equals:首先这是一个方法,这个方法定义在Object对象里,java中的每个类都直接或者间接的集成自Object类,而在Object中,equals()的方法实现如下:

    public boolean equals(Object obj) {
return (this == obj);
}
所以我们分析就可以知道,如果我们自己定义的类,没有重写equals方法,那么 调用equals 和 使用 == 对两个对象变量进行比较的结果是相同的。

1.用于比较String常量是否相等,因为String对象对equals方法重写了,所以,当我们要比较两个字符值是否相等时,建议使用equals方法。

示例:

String s1 = new String("abc");
String s2 = "abc";
//打印结果:false
System.out.println(s1 == s2);
//打印结果:true
System.out.println(s1.equals(s2));

2.对于自定义的对象,如果我们希望通过几个变量来判断这两个对象是否是同一个对象,那么我们需要重写equals和hashCode方法,然后调用equals方法

例如:我们认为,如果两个对象的age 和 name 相同 那么这两个对象就相同。

示例:

Person.java

class Person
{
private int age;
private String name;
public Person(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}

使用测试:

/** 
* @author strungle E-mail: 645707787@QQ.com
* @version 创建时间:2013-6-12 下午7:20:06
*
*/
public class Page11Number11 {

public static void main(String[] args) {
Person p1 = new Person(1,"zhangsan");
Person p2 = new Person(1,"zhangsan");
//打印结果:false
System.out.println(p1 == p2);
//打印结果:true
System.out.println(p1.equals(p2));

}
}

并且请大家注意,重写equals方法的时候也要重写对应hashCode方法,为什么呢?因为api中Object对象的equals方法的描述如下:

Note that it is generally necessary to override thehashCode method whenever this method is overridden, so as to maintain the general contract for thehashCode method, which states that equal objects must have equal hash codes. (

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 

)