==和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;
}
}