java面试加油站系列-1-Object

11月 21, 2014 |

在我10年毕业的时候,我的一个同学去参加tencent的校园招聘,面试官问了他一个问题,
1)请问Object类有哪些方法,每个方法的作用分别是做什么的?
他回来后用了一个幽默的比喻来表达他心中的遗憾:这个问题就如同问你蚂蚁有多少只脚,蚂蚁常见吧,但是没有仔细观察还真答不上来~,可以看出扎实的基础的重要性,万丈高楼从地起,勿在浮沙筑高楼!
我再抛出几个关于Object类的高频问题:

  • 2)equals() 方法 和 ”==“操作符的区别
  • 3)请问为什么要一起重写equals()方法和hashCode()
  • 4) wait()方法和sleep() 方法的区别
  • 5)wait() 和notify() , notifyAll() 如何协调多线程的同步工作
  • 6)什么时候使用getClass()方法, 使用instanceOf关键字来判定某个对象是否是某个类的实例

2)答案:
”==“是用来判定两个引用是否引用的同一个对象,equals()的语义要求是用来判定两个对象的值是否相等。
3) 答案:
因为在Object中, equals()方法的实现是比较两个对象的hashCode, 而hashCode的默认实现是直接使用该对象的物理地址作为hashCode。当我们自定义了一个类,一般我们希望它能和java 已有的容器类(List Map Set)一起工作。调用List.contains(Object obj) 或者List.index()方法查找该对象是否存在时都是调用Object.equals()来比较的,所以说我们重载了equals()方法才能实现值相等。对于使用hash算法的数据结构,比如HashMap, 想调用对象的hashCode()方法找到对象大致的位置,然后通过equals() 方法找到确切的位置。比如 假如我们将我们自定义的Class Pair 放入了List中了:
示例1:

输出:false
示例2:
用eclipse的equals() 和hashCode自动产生功能。右键->source->generate equals() and hashCode

输出:true
看到了equals 方法的重要性了吧
4)答案:
wait()主要用于线程同步,调用wait后该线程阻塞,等待其他线程在该对象上调用notify or notifyAll 来唤醒它。从而继续执行
5)答案
如4所描述
6)答案
一般当我们要准确的判断某个对象是某个类的实例的时候,我们会调用getClass方法,如示例2
示例3:

输出:

A print method called
B print method called
C print method called
uncompatable type

可以看出instanceof 一般用在定义的公共模块方法中,虽然传入的参数可能属于不同的Class,但是我们只要求它属于某个特定的class,运用instancof关键字,我们能进行安全的类型转换
对于问题1:见截图

Object方法

 

 

 

 

 

 

 

看完本博客是不是感觉原来自己了解的东西太少太少呢?哈哈,更多java基础内容,请访问javacoder.cn

Posted in: 面试加油站

Comments are closed.