==与equals方法的区别以及toString方法和hashCode方法

==和equals方法的区别

共同点:两个都是对两个变量进行比较的
1.基本类型变量的比较
基本类型变量指向的不是对象,无法调用方法,所以不能调用方法,只能使用= =进行比较,比较的也只是基本类型变量的数值是否相等。
2.引用类型变量的比较
引用类型变量指向的是对象,所以既可以使用= =也可以使用equals。
区别在于:equals方法是Object中的方法,每个对象都可以调用,默认比较的是两个对象的地址值,但是也可以重写equals方法,按照自己的逻辑比较。
= =是java中基本的操作符,无法重写,两个引用使用==进行比较,那么比较的是引用指向的内存地址值是否相同。

toString方法hashCode方法

这两个方法都是Object中的方法,所以每个对象都能直接使用
toString方法,返回该对象的字符串表示。
其形式为:类的全限定名@hashCode方法返回值的十六进制形式
即:
o.getClass().getName() + “@” + Integer.toHexString(o.hashCode())

public class Test{
	public static void main(String[] args) {
		Student s = new Student();
		String str1 = s.toString();
		String str2 = s.getClass().getName()+"@"+Integer.toHexString(s.hashCode());
		System.out.println(str1);//test.Student@15db9742
		System.out.println(str2);//test.Student@15db9742
	}
}
class Student{
	
}

注:我们可以把最后的那个十六进制数字认为是这个对象的内存地址,但是其实并不是真的地址值,而是这个对象的哈希码值,这个哈希码值默认又是通过对象地址值转换过来的一个数字。(如果我们重写了hashCode方法,那这个返回的哈希码值就真的和对象内存地址没有一点关系了)

在实际生活中,我们举一个例子,在同一所学校中,如果两个学生的学号和姓名一致,我们就认为这两个学生其实是一个人,但是在java中,我们new两个学生对象,赋予他们一样的学号和姓名,在使用equals进行比较的时候,结果仍然是false,因为比较的是地址,此时我们重写equals方法和hashCode方法,就能根据自己的要求进行比较,例如:

public class Test{
	public static void main(String[] args) {
		Student s = new Student(1,"bob");
		Student s2 = new Student(1,"bob");
		System.out.println(s.equals(s2));//false
	}
}
class Student{
	int id;
	String name;
	public Student(int id,String name) {
		this.id=id;
		this.name=name;
	}
	
}

重写equals方法和hashCode方法后

public class Test{
	public static void main(String[] args) {
		Student s = new Student(1,"bob");
		Student s2 = new Student(1,"bob");
		System.out.println(s.equals(s2));//true
	}
}
class Student{
	int id;
	String name;
	public Student(int id,String name) {
		this.id=id;
		this.name=name;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		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;
		Student other = (Student) obj;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值