针对Object类方法的相关面试题目

针对Object类方法的相关面试题目

一、Object 中所含有的方法

  • 注意:该所含方法的总结的是来自 Java8的源码。
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj)
public boolean equals(Object obj)
protected native Object clone();    
public String toString()
public final native void notify();
public final native void notifyAll();
public final void wait()
public final native void wait(long timeoutMillis);
public final void wait(long timeoutMillis, int nanos)
protected void finalize();

由上述的方法,我们大概能将 Object 主要分为几类:

  • getClass() 方法主要涉及到的是 反射和类加载

  • hashCode()、equals() 的话,主要涉及到的是 对象之间的相互比较和框架的优化效率上

  • clone() 方法主要涉及到的是 设计模式——原型模式

  • toString()方法主要涉及的是 对象值以字符串的形式展示(面试并不考这个)

  • notify()、notifyAll()、wait() 方法主要涉及到的是 并发问题

  • finalize()方法主要涉及到的是 垃圾回收问题(面试上不常问这个,而且在java8里也是被淘汰的方法)

二、引申而出的常见面试问题

由上述所介绍的方法类别,我们可以知道,在面试中,由Object对象引申的问题范围还是挺广的。

注意:此总结仅供参考

重点提出的问题如下:

# equals() 与 == 的区别是什么?
# hashCode() 与 equals() 之间有什么关系?
# wait() 方法与 sleep() 方法的区别?
# HashMap 的实现原理
# 什么是类加载机制?(或者说是谈谈对其看法)

三、对问题的解答

  1. equals() 与 == 的区别是什么?
# 首先,我们可以先看一下 equals() 在 Object 类中的定义,该定义如下:
// Object 类中 equals() 方法的定义
public boolean equals(Object obj) {
    return (this == obj);
}
-------------------------------
 // Integer 类中 equals() 方法的重写
public boolean equals(Object obj) {
   if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
   }
   return false;
}
-------------------------------
 // String 类中 equals() 方法的重写
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String aString = (String)anObject;
        if (!COMPACT_STRINGS || this.coder == aString.coder) {
            return StringLatin1.equals(value, aString.value);
        }
    }
    return false;
}
# 对于 equals() 方法
- 由上述 Object 类中的代码,我们可以知道,对于原装的 equals() 方法 是直接判断 this 和 obj 本身的值是否相等,即用来判断调用 equals() 的对象和形参 obj 所引用的对象是否是同一对象,所谓同一对象就是指内存存储单元,如果 this 和 obj 所指向的是同一块内存对象,那么就返回 true,如果所执行的地址不一致,则返回false;
# 对于 == 
- 其实由上面的代码也是可以看出来的,对于对象来说,== 比较的是内存地址是否相等,如果相等,则返回 true,如果不相等,则返回 false;
# 总结
* equals() 比较的是 对象,对于 Object类,则比较两个内存地址是否相等,而其他类可对 equals() 进行重写,使其能对其值进行比较。
* == 比较的可以是基本类型或者是对象。如果比较的是基本类型,则比较的内容是 其值;如果比较的是对象,则比较的内容是 其对象的内存地址。
  1. hashCode() 与 equals() 之间有什么关系?
# 对于 equals() 方法,在上面的问题中,已经说明完了,主要注意的是 equals() 方法所具有的特性:
- 自反性(reflexive)。对于任意不为null的引用值x,x.equals(x)一定是true。
- 对称性(symmetric)。对于任意不为null的引用值x和y,当且仅当x.equals(y)是true时,y.equals(x)也是true。
- 传递性(transitive)。对于任意不为null的引用值x、y和z,如果x.equals(y)是true,同时y.equals(z)是true,那么x.equals(z)一定是true。
- 一致性(consistent)。对于任意不为null的引用值x和y,如果用于equals比较的对象信息没有被修改的话,多次调用时x.equals(y)要么一致地返回true要么一致地返回false。
- 对于任意不为null的引用值x,x.equals(null)返回false。

# 而对于 hashCode() 方法
- hashCode() 方法给对象返回一个 hash Code 值。这个方法被用于 hash表,例如 HashMap。对于 集合查找来说,hashCode的出现是为了降低对象比较次数,提高查找效率。
其性质如下:
- 在一个Java应用的执行期间,如果一个对象提供给equals做比较的信息没有被修改的话,该对象多次调用hashCode()方法,该方法必须始终如一返回同一个integer。
- 如果两个对象根据equals(Object)方法是相等的,那么调用二者各自的hashCode()方法必须产生同一个integer结果。
- 并不要求根据equals(java.lang.Object)方法不相等的两个对象,调用二者各自的hashCode()方法必须产生不同的integer结果。然而,程序员应该意识到对于不同的对象产生不同的integer结果,有可能会提高hash table的性能。

# Java 对象的 equals 方法和 hashCode 方法是这样规定的:
- 1. 相等(相同)的对象必须具有相等的哈希码(或者散列码)。
- 2. 如果两个对象的hashCode相同,它们并不一定相同。
  1. wait() 方法与 sleep() 方法的区别?
# 对于 sleep() 方法和 wait() 方法
- sleep() 是 Thread 类的静态本地方法,而 wait() 则是 Object 类的成员本地方法。
- sleep() 方法可以在任何地方使用; wait() 方法则只能在同步方法或同步代码块中使用,否则抛出:IllegalMonitorStateException 异常
- sleep() 会休眠当前线程指定时间,释放 CPU 资源,不释放对象锁,休眠时间到自动苏醒继续执行;wait() 方法放弃持有的对象锁,进入等待队列,当该对象被调用 notify() / notifyAll() 方法后才有机会竞争获取对象锁,进入运行状态
- sleep() wait() 均需要捕获 InterruptedException 异常(针对 JDK1.8以上)
// Thread 类中的 sleep() 方法
public static native void sleep(long millis) throws InterruptedException;
// Object 类中的 wait() 方法
public final native void wait(long timeoutMillis) throws InterruptedException;
  1. HashMap 的实现原理是什么。
# 对于 HashMap有版本迭代而出现不同:
- JDK1.7 时,HashMap 是由 Table 数组和 Entry链表所组成。
- JDK1.8 时,HashMap 时由 Table 数组和 Entry链表/红黑树组成
  • 具体的东西就不多展示了,因为篇幅过长。这里就简单的提一下。
# 成员变量
- DEFAULT_INITIAL_CAPACITY // 表示的是 Table 数组的初始化长度(2^4)
- MAXIMUM_CAPACITY // 表示 Table 数组的最大长度(2^30)
- DEFAULT_LOAD_FACTOR // 负载因子(默认是0.75)当元素的总个数 > 当前数组的长度 * 负载因子。数组会进行扩容,扩容为原来的两倍(至于为什么负载因子是0.75或为什么扩容2倍,这里就会多讲了)
- TREEIFY_THRESHOLD // 链表树化阙值(默认值是8),当阈值大于8时,就会将链表转化为红黑树
- UNTREEIFY_THRESHOLD // 红黑树链化阙值(默认值是6),表示在进行扩容期间,单个Node节点下的红黑树节点的个数小于6时候,会将红黑树转化成为链表。
- MIN_TREEIFY_CAPACITY // 最小树化阈值;当Table所有元素超过改值,才会进行树化(为了防止前期阶段频繁扩容和树化过程冲突)。
  1. 什么是类加载机制?(或者说是谈谈对其看法)
	类加载过程:加载->连接->初始化。连接过程又可分为三步:验证->准备->解析。
	- 具体的就不多说了,篇幅会更多,下面有两个参考博文链接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值