在我10年毕业的时候,我的一个同学去参加tencent的校园招聘,面试官问了他一个问题,
1)请问Object类有哪些方法,每个方法的作用分别是做什么的?
他回来后用了一个幽默的比喻来表达他心中的遗憾:这个问题就如同问你蚂蚁有多少只脚,蚂蚁常见吧,但是没有仔细观察还真答不上来~,可以看出扎实的基础的重要性,万丈高楼从地起,勿在浮沙筑高楼!
我再抛出几个关于Object类的高频问题:
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class Main { public static class Pair{ int a; int b; public Pair(int a, int b) { super(); this.a = a; this.b = b; } } public static void main(String[] args) { List<Pair> list = new ArrayLis<Pair>(); list.add(new Pair(1,2)); System.out.println(list.contains(new Pair(1,2))); } } |
输出:false
示例2:
用eclipse的equals() 和hashCode自动产生功能。右键->source->generate equals() and hashCode
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public class Main { public static class Pair{ int a; int b; public Pair(int a, int b) { super(); this.a = a; this.b = b; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + a; result = prime * result + b; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Pair other = (Pair) obj; if (a != other.a) return false; if (b != other.b) return false; return true; } } public static void main(String[] args) { List<Pair> list = new ArrayList<Pair>(); list.add(new Pair(1,2)); System.out.println(list.contains(new Pair(1,2))); } } |
输出:true
看到了equals 方法的重要性了吧
4)答案:
wait()主要用于线程同步,调用wait后该线程阻塞,等待其他线程在该对象上调用notify or notifyAll 来唤醒它。从而继续执行
5)答案
如4所描述
6)答案
一般当我们要准确的判断某个对象是某个类的实例的时候,我们会调用getClass方法,如示例2
示例3:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public static class A{ public void print() { System.out.println(this.getClass().getName() + " print method called"); } } public static class B extends A{ } public static class C extends B{ } public static void main(String[] args) { A a = new A(); B b = new B(); C c = new C(); fn(a); fn(b); fn(c); fn(new Object()); } public static void fn(Object obj) { if(obj instanceof A){ A a = (A)obj; a.print(); }else{ System.out.println("uncompatable type"); } } |
输出:
A print method called
B print method called
C print method called
uncompatable type
可以看出instanceof 一般用在定义的公共模块方法中,虽然传入的参数可能属于不同的Class,但是我们只要求它属于某个特定的class,运用instancof关键字,我们能进行安全的类型转换
对于问题1:见截图
看完本博客是不是感觉原来自己了解的东西太少太少呢?哈哈,更多java基础内容,请访问javacoder.cn
Posted in: 面试加油站
Comments are closed.