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

==:

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 the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes. (

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

)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值