目录
一、equals 方法
- 只能判断引用类型
- 默认判断的是地址是否相等,也就是判断两个对象是不是同一个对象
- 子类中往往重写该方法,用于判断内容是否相等
public class Equals {
public static void main(String[] args) {
//基本数据类型,判断值是否相等
int num1 = 10;
double num2 = 10.0;
System.out.println(num1 == num2);//true
//equals 方法默认判断的是地址是否相等,也就是判断两个对象是不是同一个对象
Integer integer1 = new Integer(1000);
Integer integer2 = new Integer(1000);
System.out.println(integer1 == integer2);//false
System.out.println(integer1.equals(integer2));//true
}
}
二、hashCode 方法
- 返回该对象的哈希码值
- 实际上,由 0bject 类定义的 hashCode方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的
- 提高具有哈希结构的容器的效率!
- 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!两个引用,如果指向的是不同对象,则哈希值是不一样的
- 哈希值主要根据地址号来的!,不能完全将哈希值等价于地址
/**
* hashCode 方法
*/
public class HashCode {
public static void main(String[] args) {
A a1 = new A();
A a2 = new A();
A a3 = a1;
System.out.println("a1.hashCode()=" + a1.hashCode());//1625635731
System.out.println("a2.hashCode()=" + a2.hashCode());//1580066828
System.out.println("a3.hashCode()=" + a3.hashCode());//1625635731
}
}
class A {
}
三、toString 方法
- 默认返回:全类名+@+哈希值的十六进制
- 子类往往重写 toString 方法,用于返回对象的属性信息
- 重写 toString 方法,打印对象或拼接对象时,都会自动调用该对象的 toString 形式
- 当直接输出一个对象时,toString 方法会被默认的调用
/**
* toString方法
*/
public class ToString {
public static void main(String[] args) {
Person person = new Person("懂哥", 20, "IT");
System.out.println(person.toString());
System.out.println("==当直接输出一个对象时,toString 方法会被默认的调用==");
System.out.println(person); //等价 person.toString()
}
}
class Person {
private String name;
private int age;
private String job;
public Person(String name, int age, String job) {
this.name = name;
this.age = age;
this.job = job;
}
//重写 toString 方法, 输出对象的属性
@Override
public String toString() {//重写后,一般是把对象的属性值输出,员也可以自己定制
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", job='" + job + '\'' +
'}';
}
}
四、finalize 方法
- 当对象被回收时,系统自动调用该对象的 finalize 方法。子类可以重写该方法,做一些释放资源的操作【演示】
- 什么时候被回收:当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁该对象前,会先调用 finalize 方法。
- 垃圾回收机制的调用,是由系统来决定(即 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制
/**
* finalize 方法
*/
public class Finalize {
public static void main(String[] args) {
Car fx = new Car("飞行");
// car 对象就是一个垃圾,垃圾回收器就会回收(销毁)对象, 在销毁对象前,会调用该对象的 finalize 方法
//程序员就可以在 finalize 中,写自己的业务逻辑代码,就可以实现自己的逻辑
//如果程序员不重写 finalize,那么就会调用 Object 类的 finalize, 即默认处理
fx = null;
System.gc();//主动调用垃圾回收器
}
}
class Car {
private String name;
public Car(String name) {
this.name = name;
}
//重写 finalize
@Override
protected void finalize() throws Throwable {
System.out.println("销毁" + name + "牌子汽车");
System.out.println("释放某些资源...");
}
}