第一轮
1. 笔试 30 mins
一共六道大题,前两题有4-5个小题。
第一道大题主要是考察Java Collections:
a. LinkedList和ArrayList的区别
b. Set和List的区别
c. equals方法和hashCode方法的区别与联系
d. LinkedList更适合implement Queue
等等
第二道大题主要是考察Java Concurrency:
a. Volatile关键字的作用
b. notify和notifyAll区别并举例适用情况
c. ReadWriteLock的性质
d. Implicit lock和explicit lock比较
等等
第三道大题
写一个method比较两个double值的大小,关键在于不能用 == 而是用equals
第四道大题
以下程序的输出是什么
public class Demo{
public static void main(String [] args) {
print(3.14);
} private static void print(Number n) {
System.out.print("Number: " + n);
} private static void print(Double n) {
System.out.print("Double: " + n);
} private static void print(Integer n) {
System.out.print("Integer: " + n);
} private static void print(Float n) {
System.out.print("Float: " + n);
}
}
答案是 Double: 3.14
主要考察java中3.14这种写法默认为double类型
第五道大题
给了一个程序让指出程序的缺点。程序是用hashmap实现的,可以put整数然后get最大值。缺点两个1.线程不安全 2.getMax()效率低,因为用Collections.sort来找出最大值,可以用PriorityQueue优化。
第六道大题
给了一部分程序,实现空白的部分。主要是考察对Obsever设计模式和多个listener添加删除时的线程安全问题。用ConcurrentHashMap实现。
2. 面试 30 mins
一个面试官问一些Java基本问题,abstract vs interface,工作中interface的适用场景等。
然后问了下金融软件的系统设计的问题,比如如果客户看到的股票价格会过一会儿才显示正确值,可能是什么原因等(High Throughput causing delays)。还有如何优化系统效率,如何在多线程情况下保证正确率,如何用map-reduce方法优化系统等等。
最后问了下对Java系统怎样做high volume测试,有一个问题我没有回答上来的是“相比其他语言,Java high volume testing的最大缺点是什么”,我答了内存限制、gc的缺点等但是面试官并不认同也没有告诉我正确答案。
第二轮
1. 技术面 40 mins
一个面试官拿着第一轮笔试的卷子前前后后问了很多延伸问题比如HashMap工作机制,daemon threads vs user threads,怎样stop一个线程,double类型为何不能用==比较,ConcurrentHashMap工作原理,ArrayList、LinkedList、HashSet工作原理,线程中如何处理异常等等很多问题。
2. CV面 25 mins
一个面试官拿着简历问各种问题。主要是看对自己做过项目的理解。
3. Manager面 25 mins
Team Lead也是招聘组的头头问一些非技术问题比如为何离开原公司,对系统的理解,对金融的理解等等
4. Manager面 25 mins
上一轮组长的boss,主要介绍一下部门情况和将来的工作状况。也问一下为啥离开原公司等
第三轮
1. HR面 25 mins
主要是问以下签证情况,薪资要求等然后介绍一下公司福利和待遇
2. Manager面 45 mins
主要是跟技术组合作的金融业务组的大boss来问问题,他对我简历上一些金融数据分析的经历很感兴趣,大部分时间都是问的这些项目经历。也问一些奇奇怪怪的问题比如我感觉国内大学和英国大学各自的优缺点等。
面试全都过了,口头Offer也拿到了,不过公司并不太想提供签证所以一直拖着不给书面Offer,所以对公司感官很不好,应该是不会去了。