文章目录
- 一、概念
- 二、获取对象信息
- 三、对象比较equals方法
- 四、hashcode方法
一、概念
Object是Java默认提供的一个类。Java里面除了Object类,所有的类都是存在继承关系的,默认会继承Object父类,即所有的类的对象都可以使用Object的引用进行接收。
例:使用Object接收所有类的对象。
class Person{}
class Student{}
public class Test {
public static void main(String[] args) {
function(new Person());
function(new Student());
}
public static void function(Object obj) {
System.out.println(obj);
}
}
//执行结果:
Person@1b6d3586
Student@4554617c
在开发中,Object类是参数的最高统一类,但是Object类也存在有定义好的一些方法:
本小节中,我们主要来熟悉这几个方法:toString()方法、equals()方法、hashcoode()方法。
二、获取对象信息
如果要打印对象中的内容,可以直接重写Object类中的toString()方法,之前我们很详细的整理过了,此处不再累赘。
// Object类中的toString()方法实现:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
三、对象比较equals方法
在Java中,==进行比较时:
- 如果 == 左右两侧是基本类型变量,比较的是变量中值是否相同;
- 如果 == 左右两侧是引用类型变量,比较的是引用变量地址值是否相同;
- 如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比较的。
// Object类中的equals方法
public boolean equals(Object obj) {
return (this == obj); // 使用引用中的地址直接来进行比较
}
class Person{
private String name ;
private int age ;
public Person(String name, int age) {
this.age = age ;
this.name = name ;
}
}
public class Test {
public static void main(String[] args) {
Person p1 = new Person("张三", 21) ;
Person p2 = new Person("李四", 20) ;
int a = 10;
int b = 10;
System.out.println(a == b); // 输出true
System.out.println(p1 == p2); // 输出false
System.out.println(p1.equals(p2)); // 输出false
}
}
Person类重写equals方法后,然后比较:
class Person{
...
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false ;
}
//指的是同一个对象
if(this == obj) {
return true ;
}
// 不是Person类对象
if (!(obj instanceof Person)) {
return false ;
}
Person person = (Person) obj ; // 向下转型,比较属性值
return this.name.equals(person.name) && this.age==person.age ;
}
}
结论:比较对象中内容是否相同的时候,一定要重写equals方法,equals方法可以用编译器生成。
四、hashcode方法
- hashcode方法用来确定对象在内存中存储的位置是否相同;
- 事实上hashCode() 在散列表中才有用,在其他情况下没用。在散列表中hashCode()的作用是获取对象的散列码,进而确定该对象在散列表中的位置。
class People {
public String name;
public int age;
}
public class Test6 {
public static void main(String[] args) {
People people1 = new People();
people1.name = "张三";
People people2 = new People();
people2.name = "张三";
System.out.println(people1.hashCode());
System.out.println(people2.hashCode());
}
}
//运行结果
2083562754
1239731077
此时地址值不一样
重写hashCode()方法
class People {
public String name;
public int age;
@Override
public int hashCode() {
return Objects.hash(name);
}
}
public class Test6 {
public static void main(String[] args) {
People people1 = new People();
people1.name = "张三";
People people2 = new People();
people2.name = "张三";
System.out.println(people1.hashCode());
System.out.println(people2.hashCode());
}
}
//运行结果
774920
774920
hashCode这个方法,目前我们用不到,在数据结构HashMap,会有详解!