Object 有哪些常用方法?大致说一下每个方法的含义?说说Hashtable 与 HashMap 的区别?

Object 有哪些常用方法?大致说一下每个方法的含义?
clone 方法
保护方法,实现对象的浅复制,只有实现了 Cloneable 接口才可以调用该方法,否则抛出
CloneNotSupportedException 异常,深拷贝也需要实现 Cloneable ,同时其成员变量为引用类型
的也需要实现 Cloneable ,然后重写 clone 方法。
finalize 方法
该方法和垃圾收集器有关系,判断一个对象是否可以被回收的最后一步就是判断是否重写了此方
法。
equals 方法
该方法使用频率非常高。一般 equals == 是不一样的,但是在 Object 中两者是一样的。子类一
般都要重写这个方法。
hashCode 方法
该方法用于哈希查找,重写了 equals 方法一般都要重写 hashCode 方法,这个方法在一些具有哈
希功能的 Collection 中用到。
一般必须满足 obj1.equals(obj2)==true 。可以推出 obj1.hashCode()==obj2.hashCode() ,但是
hashCode 相等不一定就满足 equals 。不过为了提高效率,应该尽量使上面两个条件接近等价。
JDK 1.6 1.7 默认是返回随机数;
JDK 1.8 默认是通过和当前线程有关的一个随机数 + 三个确定值,运用 Marsaglia’s xorshift
scheme 随机数算法得到的一个随机数。
wait 方法 配合 synchronized 使用, wait 方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥
有者,也就是具有该对象的锁。 wait() 方法一直等待,直到获得锁或者被中断。 wait(long timeout)
设定一个超时间隔,如果在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
1. 其他线程调用了该对象的 notify 方法;
2. 其他线程调用了该对象的 notifyAll 方法;
3. 其他线程调用了 interrupt 中断该线程;
4. 时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个 InterruptedException 异常。
notify 方法
配合 synchronized 使用,该方法唤醒在该对象上 等待队列 中的某个线程(同步队列中的线程是给
抢占 CPU 的线程,等待队列中的线程指的是等待唤醒的线程)。
notifyAll 方法
配合 synchronized 使用,该方法唤醒在该对象上等待队列中的所有线程。
总结
只要把上面几个方法熟悉就可以了, toString getClass 方法可以不用去讨论它们。该题目考察的
是对 Object 的熟悉程度,平时用的很多方法并没看其定义但是也在用,比如说: wait() 方法,
equals() 方法等。
大致意思:Object 是所有类的根,是所有类的父类,所有对象包括数组都实现了 Object 的方法。
说说Hashtable HashMap 的区别?
本来不想这么写标题的,但是无奈,面试官都喜欢这么问 HashMap
1. 出生的版本不一样, Hashtable 出生于 Java 发布的第一版本 JDK 1.0 HashMap 出生于 JDK
1.2
2. 都实现了 Map Cloneable Serializable (当前 JDK 版本 1.8 )。
3. HashMap 继承的是 AbstractMap ,并且 AbstractMap 也实现了 Map 接口。 Hashtable 继承
Dictionary
4. Hashtable 中大部分 public 修饰普通方法都是 synchronized 字段修饰的,是线程安全的,
HashMap 是非线程安全的。
5. Hashtable key 不能为 null value 也不能为 null ,这个可以从 Hashtable 源码中的 put
法看到,判断如果 value null 就直接抛出空指针异常,在 put 方法中计算 key hash 值之
前并没有判断 key null 的情况,那说明,这时候如果 key 为空,照样会抛出空指针异常。
6. HashMap key value 都可以为 null 。在计算 hash 值的时候,有判断,如果
key==null ,则其 hash=0 ;至于 value 是否为 null ,根本没有判断过。
7. Hashtable 直接使用对象的 hash 值。 hash 值是 JDK 根据对象的地址或者字符串或者数字算出
来的 int 类型的数值。然后再使用除留余数法来获得最终的位置。然而除法运算是非常耗费时
间的,效率很低。 HashMap 为了提高计算效率,将哈希表的大小固定为了 2 的幂,这样在取
模预算时,不需要做除法,只需要做位运算。位运算比除法的效率要高很多。
8. Hashtable HashMap 都使用了 Iterator 。而由于历史原因, Hashtable 还使用了
Enumeration 的方式。
9. 默认情况下,初始容量不同, Hashtable 的初始长度是 11 ,之后每次扩充容量变为之前的
2n+1 n 为上一次的长度)而 HashMap 的初始长度为 16 ,之后每次扩充变为原来的两倍。
另外在 Hashtable 源码注释中有这么一句话: Hashtable is synchronized. If a thread-safe implementation is not needed, it is
recommended to use HashMap in place of Hashtable . If a thread-safe highly
concurrent implementation is desired, then it is recommended to use
ConcurrentHashMap in place of Hashtable.
大致意思: Hashtable 是线程安全,推荐使用 HashMap 代替 Hashtable ;如果需要线程安全高并
发的话,推荐使用 ConcurrentHashMap 代替 Hashtable
这个回答完了,面试官可能会继续问: HashMap 是线程不安全的,那么在需要线程安全的情况下
还要考虑性能,有什么解决方式?
这里最好的选择就是 ConcurrentHashMap 了,但面试官肯定会叫你继续说一下
ConcurrentHashMap 数据结构以及底层原理等。

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