如果你需要准备面试,可以看一下这篇博客中20个为Java开发人员准备的面试投行的问题。
大量的Java开发人员面试例如巴克莱银行(Barclays)、瑞士信贷集团(Credit Suisse)、花旗银行(Citibank)这样的投行的Java开发岗位,但是大多数人都不知道会被问什么问题。
这篇文章中,我将分享一些对于3年经验以上的程序员会被问的最多的问题。
对于两年及两年以下Java开发经历的人,投行一般不会通过社招招聘,一般只有可能在毕业时候通过校招进去。
实际面试的时候并不保证一定会被问到这些问题,而且实际上,大概率问不到,但是通过这篇文章你能够知道大概会被问什么类型的问题。而且你准备的越充分,面试的时候表现的会越好。
另外,如果这20个问题你觉得不够的话,可以看两篇文章:电话面试的40个Java面试问题 和 200+ Java 面试问题。
话不多说,进入正题。接下来我们开始看我从朋友和大学同学那里收集到的他们面试投行遇到的问题。
Java程序员投行面试问题 问题1: 多线程环境下使用HashMap有什么问题,什么时候使用get()方法会进入死循环?答:没什么问题,会不会出问题取决于你怎么用。例如,如果你在一个线程内初始化一个HashMap,所有线程只是读取数据,那么没什么问题。例如Map
包含配置信息,服务启动就不会更改。真正有问题的情况下是至少一个线程对HashMap做了改动,例如:增加、更新或者移除任何的键值对。因为put()操作会引起re-sizing,有可能导致死循环,所以应该使用Hashtable或者ConcurrentHashMap,后面这个更好一些。
答:这是一个好问题。根据我得理解,一个差的hashcode方法会导致HashMap的频繁碰撞, 然后导致往hashMap中添加一个对象的时候耗时增加。
从Java 8开始, key碰撞比之前Java版本的Key碰撞对性能影响要小一些,在大于某一个阈值后,二叉树会取代,链表最坏情况下O(n)的性能问题会减少到二叉树的O(logN)。
问题3:Java里面所有的不变的属性需要设置为final吗?答:没有必要,你可以实现相同的功能通过以下操作:设为非final的private 变量,且只有在构造函数中才能修改。不设set方法,如果是一个可变对象,不要泄露任何指向这个对象的引用。
设置一个引用变量为final 只能确保这个变量不会被赋予一个不同的引用,但是你仍然可以改变引用变量的属性值。
这是面试官想要听到的一个点。如果你想要知道更多Java中引用变量的知识,推荐加入Udemy的课程Complete Java Masterclass
问题4:String的substring()的实现原理答:substring取原来string的一部分创建一个新的对象。这个问题主要想问的是开发者是否熟悉substring可能导致的内存泄露风险。
直到Java1.7, substring 拥有原来的字符数组的引用,这意味着即使是五字符这么小的字符串,也可能会导致一个1GB字符数组无法被垃圾回收因为有一个强引用。
这个问题在Java1.7中已经被修复,原来的字符数组不会被引用,但是会导致创建substring耗时会有点长,以前时间复杂度是O(1), Java 7之后时间复杂度是O(n)。
问题5:写一个单例模式的临界区代码(答案)答: 这个问题实际上是想让候选人写一个双重校验锁。
记得使用volatile变量
确保单例线程安全
这是使用双重校验锁写的线程安全的单例代码:
public class Singleton { private static volatile Singleton _instance; /** * Double checked locking code on Singleton * @return Singelton instance */ public static Singleton getInstance() { if (_instance == null) { synchronized (Singleton.class) { if (_instance == null) { _instance = new Singleton(); } } } return _instance; } }与此同时,最好能够知道典型的设计模式,比如单例模式、工厂模式、装饰模式等,如果你对这个感兴趣,Design Pattern library 这个不错。
问题6:Java中如何处理写存储过程或者读存储过程时遇到的错误?答: 这是Java面试中最难的问题之一。我的回答是一个存储过程应该在操作错误时返回错误码,但是如果存储过程本身出问题,捕获SQLException 是唯一选择。
Effective Java:3rd Edition 中对于Java的异常和捕获有很多好的建议,值得一读。
问题7:Executor.submit()和Executer.execute()有什么区别?答 这个面试问题来自于我的这篇文章。随着对于Java开发人员的并发技能要求的增加,
这个题目越来越受欢迎。
答案是,前者返回一个Future对象,可以用于找到工作线程的运行结果。