Java常用类---Object类-->toString方法、getClass方法、finalize方法、equals方法、hashCode方法、wait方法、notify方法

toString方法

Object类的toString方法返回一个字符串,该字符串由类名 + @ + 此对象的哈希码的无符号十六进制表示组成,如下图所示。

补充:

  1. 在Java中,哈希码代表了对象的一种特征,eg:判断某两个字符串是否等同,如果其哈希码相等,则这两个字符串是相等的。

  2. 哈希码是一种数据结构的算法。常见的哈希码的算法有:Object类的hashCode(返回对象的内存地址)、String类的hashCode(字符串内容)、Integer类的hashCode(整数的数值)。

有属性类中,toString方法的创建,如下图所示。

Java常用类---Object类-->toString方法、getClass方法、finalize方法、equals方法、hashCode方法、wait方法、notify方法_第1张图片

使用toString方法可以返回有属性类中的属性,如下图所示。

Java常用类---Object类-->toString方法、getClass方法、finalize方法、equals方法、hashCode方法、wait方法、notify方法_第2张图片

getClass方法

使用getClass方法可以获得一个实例的类型类。类型类指代表一个类型的类,在java中一切皆为对象,即可以用类型类来表示一个类型,所有的类型类都是Class类的实例。

getClass方法的调用,如下图所示。

Java常用类---Object类-->toString方法、getClass方法、finalize方法、equals方法、hashCode方法、wait方法、notify方法_第3张图片

注:getClass方法不可重写!!!可使用getName方法可以获得该类型的全称名称。

补充:

  1. 类型类是一一对应的,父类的类型类和子类的类型类是不同的。

  2. 已知实例对象,可以通过getClass()方法获得该实例对象的类型类。

  3. 已知类型,可以使用.class的方法获得该类型的类型类。

    注:2、3项表达效果一致,如下图所示。

    Java常用类---Object类-->toString方法、getClass方法、finalize方法、equals方法、hashCode方法、wait方法、notify方法_第4张图片

finalize方法

在Java中,允许在类中定义一个名为finalize的方法,该方法用于释放资源。定义如下图所示。

finalize方法一般使用在一种特殊情况下,即通过某种创建对象以外的方式为对象分配了存储空间,一般发生在使用了本地方法的情况下

注:本地方法是指一种在Java中调用非Java代码的方式。

工作原理为:当垃圾回收器准备好释放对象所占用的存储空间时,第一步将调用该类中的finalize方法,随后在下一次垃圾回收动作发生时,才真正回收对象所占用的内存。

补充:

垃圾回收是一种内存回收机制,解决了内存管理机制,使用垃圾回收机制可以有效防止内存泄漏,有效的使用空闲的内存。

注:内存泄漏指该内存空间使用完毕后未回收,在不涉及复杂数据结构的一般情况下,java的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度。

垃圾回收需要注意的要点:

  1. 对象不一定会被回收,只要JVM还没有达到内存耗尽的时候,一般不会进行垃圾回收。

  2. 垃圾回收不等于"析构"。

    注:析构函数与构造函数相反,当对象结束其生命周期,eg:对象所在类的函数已经调用完毕,系统会自动执行析构函数。

  3. 垃圾回收只和内存有关,只有为了回收不再使用的内存才会使用垃圾回收功能。

  4. 无论对象是如何创建的,垃圾回收器都会负责释放对象所占据的所有内存。

equals方法

Object类中的equals方法定义,如下图所示。

Java常用类---Object类-->toString方法、getClass方法、finalize方法、equals方法、hashCode方法、wait方法、notify方法_第5张图片

通过equals方法可以判定调用equals方法的对象和形参对象是否为同一个对象,即是否指向内存中同一块存储单元。如下图所示。

Java常用类---Object类-->toString方法、getClass方法、finalize方法、equals方法、hashCode方法、wait方法、notify方法_第6张图片

注:即使是内容完全的相同的两块不同内存对象,也返回false,如上图所示。

如果希望不同内存但相同内容的两个对象,使用equals方法时,返回true,即比较内容是否完全相同。则需要重写父类的equal方法。如下图所示,String类中实现了object类中的equals方法的重写。

Java常用类---Object类-->toString方法、getClass方法、finalize方法、equals方法、hashCode方法、wait方法、notify方法_第7张图片

笔者重写equals方法,实现了两个对象内容是否相同的判断,如下图所示。

Java常用类---Object类-->toString方法、getClass方法、finalize方法、equals方法、hashCode方法、wait方法、notify方法_第8张图片

注:

当equals方法被重写时,通常需要重写hashCode方法。因为相同的对象在规定中必须要有相同的哈希码。即:当a.equals(b)为true时,a.hashCode() == b.hashCode必须为true。反之,也必须成立。

如果只是单独重写了equals方法,再new一个新的对象,当原对象.equals(新对象)为true的时候,两者的hashCode是不同的。

hashCode方法

hashCode方法用于返回一个对象的哈希码值。

一般来说,当equals方法被重写时,hashCode方法也需要重写,hashCode重写方法如下如所示。

Java常用类---Object类-->toString方法、getClass方法、finalize方法、equals方法、hashCode方法、wait方法、notify方法_第9张图片

在重写中,使用到了17、31这两个质数。其中质数31是特别的质数,它可以进一步减少HashCode值的碰撞。因为任何数乘以31就等于这个数与2的5次幂相乘再减去这个数本身,如下式所示。

x * 31 = (x * 2^5)-x

即等价于x*31 == (x << 5) - x。其中<<为左移符号,表示乘以2的几次方。

关于左移符号的详细介绍,点击此处

注:

  1. 哈希码可以是负值,负哈希码完全合法。

  2. 在java中基本数据类型没有hashCode方法。

wait方法

wait方法是Object类中的一个方法,用于让当前线程进入等待状态,直到其他线程调用该对象的notify或notifyAll方法才可以唤醒它。

调运wait方法必须使用在synchronized中。故,wait方法只能够被在同步块内或者同步方法中调用,否则会抛出IllegalMonitorStateException(当前线程不是此对象监视器的所有者)。

注:synchronized关键字能够保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。

在执行wait方法之前,线程必须先获得锁,wait方法会释放该锁,使得其他线程可以获得这个锁。当wait方法返回后,当前线程又会重新获取这个锁。

wait方法的使用如下图所示。

Java常用类---Object类-->toString方法、getClass方法、finalize方法、equals方法、hashCode方法、wait方法、notify方法_第10张图片

在调用wait方法后,当前线程便进入睡眠状态,直到发生下列情况,才退出等待。

  1. 其他线程调用了该对象的notify方法。

  2. 其他线程调用了该对象的notifyAll方法。

  3. 其他线程调用了interrupt中断该线程。如果该线程是被中断的话,会抛出一个InterruptedException异常。

  4. 已达到固定时间间隔。

补充:wait方法有三种重载方法,即添加了long timeout 和 int nanos两个参数,形成了带参数的wait方法,能够更好地控制在放弃之前等待通知的时间量。如下图所示。

Java常用类---Object类-->toString方法、getClass方法、finalize方法、equals方法、hashCode方法、wait方法、notify方法_第11张图片

其中:用毫微秒度量的实际时间量可以通过下式计算得出。

1000000 * timeout + nanos

注:

long timeout 指等待的最长时间(毫秒为单位)

int nanos 指额外时间(毫微秒(纳秒)为单位)

notify方法

notify方法用来唤醒在该对象上等待的某个线程。

注:调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM来确定唤醒哪个线程,而不是按照优先级顺序。

notifyAll方法用来唤醒在该对象上等待的所有线程。

注:并不是给所有唤醒线程一个对象的锁,而是让它们竞争。

你可能感兴趣的:(java,开发语言)