1.equals方法
==运算符
比较运算符,即可以判断基本类型又可以判断引用类型
如果判断基本类型,则判断值是否相等
如果判断引用类型,则判断地址是否相等,即判断是否为同一个对象
equals
是object类的一个方法,只能判断引用类型
object - equals源码:
public boolean equals(Object obj) { return (this == obj); }
可以清晰的看到,object类里的equals方法是判断对象的地址是否相同(是不是同一个对象)
但是,其他数据类型类会重写equals方法,比如String类的重写:(判断两个字符串的值是否相等)
public boolean equals(Object anObject) { if (this == anObject) { return true; } return (anObject instanceof String aString) && (!COMPACT_STRINGS || this.coder == aString.coder) && StringLatin1.equals(value, aString.value); }
实例:
String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1 == str2); // false System.out.println(str1.equals(str2)); // true
2.hashCode
提高具有哈希结构的容器的效率
两个引用如果指向同一个对象,哈希值肯定(不冲突的情况下)一样,反之不一样
哈希值根据地址而来但并非地址
演示:
// hashCode A a = new A(); A a1 = new A(); A a2 = a; System.out.println(a.hashCode()); // 1324119927 System.out.println(a1.hashCode()); // 990368553 System.out.println(a2.hashCode()); // 1324119927
3.toString
返回该对象的字符串表示
源码:
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
实例:
// toString A a3 = new A("dahe",25,"安全服务工程师"); System.out.println(a3.toString()); -------------------------- 输出: classes.A@41629346 包名.类名@十六进制的hashCode
现在我们在类中重写一下toString方法(模板):
@Override public String toString() { return "A{" + "name='" + name + '\'' + ", age=" + age + ", job='" + job + '\'' + '}'; }
再次运行上面的代码,现在输出如下:
A{name='dahe', age=25, job='安全服务工程师'}
另外,当我们直接输出对象时,会默认直接调用toString
方法:
System.out.println(a3); // A{name='dahe', age=25, job='安全服务工程师'}
4.finalize
当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作
注意:在JDK18中。finalize被弃用了。它虽然可以帮助我们主动释放系统底层资源,但是说实话,没用过,Java 是自动管理内存的,使用它反而会导致潜在的系统安全风险,没帮助不说反而是负担,所以计划移除了。😁
实例:
// finalize A a4 = new A("dh",33,"架构师"); a4 = null; // 这是a4成为了垃圾,垃圾回收器就会回收对象 // 在销毁对象之前,会调用对象的finalize方法 // 程序员就可以在这个方法中写入自己的业务,释放资源
重写finalize方法:
@Override protected void finalize() throws Throwable { System.out.println("我们销毁对象"); }
除此之外,还可以主动运行垃圾回收器:
System.gc(); // 主动调用垃圾回收器