Loading

Java Object类

java Object 类是所有类的父类,也就是说Java的所有类都继承了Object,子类可以使用Object的所有方法

Object 类位于 java.lang 包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承 Object,成为 Object 的子类。

类的方法:

  • protected Object clone():创建并返回一个对象的拷贝
  • boolean equals(Object obj):比较两个对象是否相等
  • protected void finalize():当GC(垃圾回收器)确定不存在对该对象的有更多引用时,由对象的垃圾回收器调用此方法
  • Class<?> getClass():获取对象的运行时对象的类
  • int hasCode():获取对象的 hash 值
  • void notify():唤醒在该对象上等待的某个线程
  • void notifyAll():唤醒在该对象上等待的所有线程
  • String toString():返回对象的字符串表示形式
  • void wait():让当前线程进入等待状态,知道其他线程调用此对象的notify()方法或notifyAll()方法
  • void wait(long timeout):让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 或 notifyAll() 方法,或者超过参数设置的timeout超时时间
  • void wait(long timeout, int nanos):与 wait(long timeout) 方法类似,多了一个 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒(其主要作用应该在能更精确控制等待时间)

面试题:

参考:https://blog.csdn.net/xl_1803/article/details/80445481

https://blog.csdn.net/Rex_WUST/article/details/95739535

https://blog.csdn.net/VIP_WangSai/article/details/77505517

1、为什么重写了equals()也要重写hashCode()

在重写equals时,需要重写hashCode,不然会出现与预期不符的结果,以保证他们是相同的比较逻辑

HashMap是底层实现时数组加链表。
  A.当put元素时:
   1.首先根据put元素的key获取hashcode,然后根据hashcode算出数组的下标位置,如果下标位置没有元素,直接放入元素即可。
   2.如果该下标位置有元素(即根据put元素的key算出的hashcode一样即重复了),则需要已有元素和put元素的key对象比较equals方法,如果equals不一样,则说明可以放入进map中。这里由于hashcode一样,所以得出的数组下标位置相同。所以会在该数组位置创建一个链表,后put进入的元素到放链表头,原来的元素向后移动。
  B.当get元素时:
根据元素的key获取hashcode,然后根据hashcode获取数组下标位置,如果只有一个元素则直接取出。如果该位置一个链表,则需要调用equals方法遍历链表中的所有元素与当前的元素比较,得到真正想要的对象。
可以看出如果根据hashcdoe算出的数组位置尽量的均匀分布,则可以避免遍历链表的情况,以提高性能。
所以 要求重写hashmap时,也要重写equals方法。以保证他们是相同的比较逻辑

  主要是为了hashmap或者hashset避免逻辑上冲突吧,比如你创建一个Map然后new一个student对象,赋唯一属性,如姓名身高体重,然后给定学号map.put(stu,23),当你get(stu)就能得到该学生学号,这时候你又new了一个一模一样的人也是就student,如果不重写hashcode,那么会默认用hash地址算法,得到的不一样的hashcode值,这时候你get这个学生的学号就无法get到了,因为hashcode不同

equals方法:

Object类中的equals()方法定义如下:

public boolean equals(Object obj) {
    return (this == obj);
}
  • 基本数据类型:比较的是==两边值是否相等
  • 引用数据类型:比较的是==两边内存地址是否相等

所有要实现自己的equals()方法都要遵守下面几个规则

  • 自反性:对于任何对象x,x.equals(x)应该返回true
  • 对称性:对于任何两个对象x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true
  • 传递性:对于多个对象x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么y.equals(z)也应该返回true
  • 一致性:对于两个非空对象x,y,在没有修改此对象的前提下,多次调用返回的结果应该相同
  • 对于任何非空的对象x,x.equals(null)都应该返回false

hashCode方法:

Object中的hashCode()方法是一个本地方法,返回一个int类型的哈希值。

  • hashCode:用来计算该对象放入数组中的哪个位置
public native int hashCode();

这两个方法经常出现在HashMap

posted @ 2020-11-14 22:18  小飞猪咯咯  阅读(98)  评论(0编辑  收藏  举报