技术开发 频道

国外投资银行最常问的10个Java面试问题!

  【IT168 资讯】现在的银行早已经有了自己成熟稳定的信息化团队,自然也成为了不少技术人员求职的好去处。这篇来自国外的面试文章清楚表明很多Java开发人员乐于向花旗银行、巴克莱银行,瑞士信贷银行提交申请,但很多人可能还不清楚面试时可能会被问到哪些问题。

  本文的作者分享了投资银行的一些常见面试问题,主要针对3年以上工作经验的Java开发人员,这些问题不适用于新手或具有1 - 2年Java经验的人员。通常情况下,银行开放式访谈不会雇佣经验较少的开发者。并且,银行内还有不少实习生是名牌大学的研究生。

  不保证一定会被问到,但这个列表你可以尝试看看:

  问题1:在多线程环境中使用HashMaps有什么问题?get()方法何时进入无限循环?

  答:没有什么方法是错误的——这取决于程序员如何使用它。例如,如果只使用一个线程初始化HashMap,并且所有线程都只能从中读取,那么这非常好。其中一个例子是包含配置属性的Map。当不止一个线程正在更新HashMap,即添加,更改或删除任何键值对时,真正的问题就开始了。

  由于put()操作可能会导致重新调整大小,从而导致无限循环,这就是为什么要使用Hashtable或ConcurrentHashMap(后者更好)。

国外投资银行最常问的10个Java面试问题!

  问题2:不覆盖hashCode()方法是否有任何性能影响?

  答案:这是一个很好的问题,几乎会问所有面试者。一个糟糕的hashCode函数会导致HashMap中频繁的冲突,最终增加向HashMap中添加对象的时间。

  然而,从Java 8开始,冲突不会像早期版本那样影响性能。因为在阈值之后,链接列表将被二叉树替换,这在最坏的情况下时间复杂度还可以达到O(log N)。

  这个问题有时难以回答,是因为许多开发人员只知道equals 和hashcode契约,并没有考虑它们的性能影响。

  equals 和hashcode契约:

  1. 如果两个对象相等,它们的hash code必须相等;

  2. 如果两个对象的hash code相等,这两个对象不一定相等。

  问题3:不可变对象的所有属性都必须是final吗?

  答:不必要。如上所述,可以不是final而是 private - 不是在构造函数中修改它们来实现相同的功能,不要为它们提供setter方法。如果是一个可变对象,永远不要泄露对该成员的任何引用。

  请记住,变量属性设为final仅确保它不会被重新分配不同的值,但仍可以更改该引用变量所指向的对象的各个属性。这是面试官希望从候选人那里听到的关键点之一。提到这一点,就可以得到一些分数。

  问题4:String中的substring()如何工作?

  答:许多开发人员知道答案:“子字符串通过获取原始字符串的一部分,从原字符串中创建一个新对象。”

  但我认为这个答案是不够的。这个问题的目的在于看看开发人员是否熟悉子串可能产生的内存泄漏风险。

  在Java 1.7之前,一个保存了原始字符数组引用的子字符串,意味着5个字符长的子字符串也可以通过保留强引来阻止垃圾收集中的1GB字符数组。

  这个问题在Java 1.7中得到了修复,原来的字符数组不再被引用,但是这种改变也使得创建子字符串在时间上成本更高。早些时候,它在O(1)范围内,在Java 7最坏的情况下可能是O(N)。

  问题5:你能为singleton编写关键部分代码吗?

  答:这个核心Java问题是前一个问题的后续,希望面试者使用双重检查锁定模式编写Java单例,请记住使用volatile变量来使Singleton线程安全。

  以下是使用Double-Checked Locking模式保证单例模式在多线程环境下安全性的代码:

国外投资银行最常问的10个Java面试问题!

  问题6:在编写存储过程或从Java访问存储过程时,如何处理错误条件?

  答:这是Java面试题中几乎对所有人开放的问题。如果某个操作失败,存储过程应该返回一个错误代码,但如果存储过程本身失败,那么捕获SQLException是唯一的选择。

  问题7:Executor.submit()和Executer.execute()方法有什么区别?

  这个问题来自投资银行针对有经验的程序员的50个Java多线程问题列表。

  由于拥有良好并发技能的Java开发人员的巨大需求,它日益普及。顺便说一句,如果想认真构建并发技能,那么Heinz Kabutz的Java Concurrency in Practice 课程是一个很好的开始。它是关于Java并发的较高级课程之一,也是基于Brian Goetz和其公司的经典书籍Java Concurrency in Practice。

  这个Java面试问题的答案是前者返回一个Future对象,它可以用来从worker线程中查找结果。查看异常处理时有区别。如果任务抛出一个异常(如果是在执行时提交的),这个异常将进入未捕获的异常处理程序(当没有显式提供异常时,默认只会将堆栈跟踪打印到System.err)。

  如果在提交任何抛出异常时提交了任务,则检查异常与否,这是任务返回状态的一部分。对于已提交并以异常终止的任务,Future.get()将重新抛出此异常,并包装在ExecutionException中。

  问题8:Factory 和Abstract Factory模式有什么区别?

  与Factory模式相比,Abstract Factory提供了更多级别的抽象。

  考虑不同的Factory,每个Factory都从Abstract Factory扩展而来,负责根据Factory类型创建不同的对象层次结构。

  例如,AbstractFactory可以通过AutomobileFactory,UserFactory,RoleFactory等进行扩展。

  每个Factory都将负责创建该类型的对象。

  这是Factory和Abstract Factory模式的UML图:

国外投资银行最常问的10个Java面试问题!

  问题9:什么是Singleton?让整个方法同步还是只有关键部分同步更好?

  答:Java中的Singleton是在整个Java应用程序中只有一个实例的类。例如,java.lang.Runtime是一个Singleton类。

  在Java 5之前创建Singleton是棘手的,自从Java 5引入Enum,它变得非常容易。

  这个问题需要程序员了解使用Enums编写单例和使用双重检查锁定的一些细节,这是此Java面试问题的目的。

  问题10:你能编写用于在Java 4和Java 5中迭代HashMaps的代码吗?

  答:这是一个棘手问题,程序员可以设法使用while和for循环。但实际上,有几种方法可以遍历Java中的所有Map。

  第一种方法涉及使用keySet()并迭代该键,然后使用get()方法检索值,这有点贵。

  第二种方法涉及使用entrySet()并遍历它们,方法是使用for循环或使用Iterator.hasNext()方法。这个方法更好。因为在迭代过程中key和value对象都可用,并且不需要调用get()方法来检索值,这可以提供O(N)性能。

  如果使用Java 8并且有树而不是链接列表,可能会稍微好一点。

  结论

  这就是投资银行常见的Java面试问题。如果你正在寻找Java开发人员相关岗位,那么应该多了解Java并发性,多线程,集合,JVM内部结构,垃圾回收以及如何提高Java应用程序的性能。

0
相关文章