问问每一位优秀的Java / Java EE开发人员应该能够回答?

我正在经历的问题每一个好的.NET开发人员都应该能够回答这个问题的内容和方法,给我留下了深刻的印象,所以本着同样的精神,我正在为Java / Java EE开发者提出这个问题。

你认为一个好的Java / Java EE程序员能够回答什么问题?

我将这个问题标记为社区wiki,因为它不是用户特定的,它旨在为广大的编程社区提供服务。

期待一些惊人的回应。

编辑 :请按照评论中的build议回答问题,以便人们可以学习有关语言的新内容。

hashCode()和equals()之间的关系是什么? 这些方法有什么意义? 有什么要求实施他们?

Set,Map和List有什么区别?

我仍然很惊讶有多less人在电话采访中不知道这个。

一个接口可以扩展多个接口吗?

大多数人回答“不”,因为他们知道java没有多重inheritance。 但是一个接口仍然可以扩展多个接口(但是一个类不能扩展多个类)。 这不会导致钻石问题。

如果答案是“否”,面试官应该问“为什么被禁止?”。 然后你开始考虑这个问题,你应该认识到它没有问题。

所以你在面试中学到了一些东西(你自己),你向面试官展示了你能够推理出类,对象,inheritance,多态等等。它实际上比一个知道答案的候选人好得多,明白为什么

在方法调用中使用final关键字。 例如,为什么在下面的代码中的方法testing不会给出任何编译错误,尽pipe使用方法参数的最终限定符。

 class Name { private String name; public Name (String s) { this.name = s; } public void setName(String s) { this.name = s; } } private void test (final Name n) { n.setName("test"); } 

一个肯定是比较string。 之间的区别

String helloWorld =“Hello World”;
helloWorld ==“Hello World”;
“Hello World”.equals(helloWorld);

诀窍问题:在Java中通过引用传递了哪些参数?

有多less人仍然鹦鹉的“原始物质是通过价值传递,物体是通过参考传递”的口头禅是惊人的。

你说“好”,“开发者”。 这是我的2分钱.. 🙂

  • 什么是“检查exception”是什么意思?
  • 哪一个更好用,何时:断言或exception处理意外情况?
  • 为什么String类是最终的? (或不是?))
  • 是Object类中的wait,notify和notifyAll方法吗?
  • 为什么不是线程类最终? 为什么我会延长线程?
  • 为什么有两个Date类; 一个在java.util包中,另一个在java.sql中?
  • 如果在finally块中抛出exception会怎么样? 剩下的最后是否被执行?
  • 有一个垃圾收集器好吗,但是在Java应用程序中完全没有内存泄漏? 如果不是,怎么样?

对于J2EE:

  • 在servlet中有实例/静态variables是否好? 为什么不? 那么你在哪里存储“状态”?
  • 继续上面的问题:(networking)应用程序的“状态”在哪里?
  • 如果我开始在“JSP”中创build/closures数据库连接,会发生什么情况?
  • 什么是处理JSPexception的方法? 试着抓? 呃..还有别的吗?

我可以想更多,但更多的,但现在这样做:)

String,StringBuffer和StringBuilder有什么区别?

“什么是部署描述符?”

如果候选人不寒而栗,他有与3.0以前的EJB工作的经验。

许多问题和采访都可以在http://www.techinterviews.com/interview-questions/java上find ,我并没有看到复制/粘贴select的价值。

不,这取决于你自己编写认为重要的东西。 就我个人而言,我总是分两步走:首先几个问题,以获得经验和技能的基本概念,然后解决问题的情况。 我确实不相信能够回答任何已知的问题会使你成为一个好的或不好的问题解决者。 所以,我更喜欢让人们解决一个给定的问题,给他们一些要求,并要求他们写代码(但不是写在纸上)。 我给他们一些时间回来看看他们是怎么做的,他们的编码风格,他们如何使用build议的API等等。

所有人都说,我最喜欢的问题是“你不喜欢Java? (本着这一精神)。 这真的是一个很好的问题,它让你立即反馈一个候选人使用Java的多less,并探索其API,如果他只是虔诚的(如OP写)。

更新:正如CPerkins所build议的,对于上面提出的问题,更好的措辞可能是“你最希望在Java中看到什么?”。 事实上,我更喜欢这种方式。

什么是System.out.println中的'System','out','println'? 当你在HashMap上调用put时会发生什么?

  1. 解释Java中使用的各种访问修饰符。 我有很多人为此而苦恼,特别是默认访问。
  2. 如果你可以改变一个关于Java语言或平台的东西,它会是什么? 好的开发者会在这里得到答案,而那些对开发不感兴趣的人可能不在意。
  3. 如果他们的简历中提到了他们使用EJB2.1的内容,那么可以询问关于EJB3的知识。 最好的开发者会跟上最新的发展,即使他们不使用新版本。
  • 当压倒一切的时候,总合同是什么?
  • 更好的select喜欢列表或数组?
  • 什么是普遍接受的命名约定?
  • 序列化如何工作?
  • 如何实现可比较?
  • 使用JDBC的Prepared Statements有什么好处?
  • 什么是Java EE?
  • 什么是容器,它提供什么服务?

如果你正在招聘gradle生与Java“经验”一个简单的问题,如写一些将导致NullPointerException抛出的代码可以区分哪些候选人最近使用过Java,并不只是当他们完成他们的单位/课程时停止。

什么将被打印?

 public void testFinally(){ System.out.println(setOne().toString()); } protected StringBuilder setOne(){ StringBuilder builder=new StringBuilder(); try{ builder.append("Cool"); return builder.append("Return"); }finally{ builder.append("+1"); } } 

:CoolReturn + 1

有点困难:

 public void testFinally(){ System.out.println(setOne().toString()); } protected StringBuilder setOne(){ StringBuilder builder=new StringBuilder(); try{ builder.append("Cool"); return builder.append("Return"); }finally{ builder=null; /* ;) */ } } 

:CoolReturn

抽象类和接口有什么区别? 你什么时候使用他们每个人?

许多Java开发人员不知道这一点,我在大学的计算机科学课程上问大多数人,绝大多数人无法回答。

简单的问题,

  • 什么是JRE和JDK?
  • 为什么java要求互操作性?

虽然这些都是非常基本的,但很多开发人员并不知道答案。 我build议在代码相关的查询之前询问这些。

前5个J2EE / JEE问题

我所面对的J2EE / JEE中间件问题的列表非常长,但是这里列出了我所提出的前5名,并且引出了很好的讨论:

  1. 当一个MDB遇到一个它无法处理的exception时会发生什么?
    这个问题通常会导致关于有害消息,错误队列等的各种有趣的讨论,
  2. 给定一个JMS主题,以及不同JVM上的一些消费者,提供关于持久消费者和不持久消费者的各种情况的问题。
    这个问题通常允许我讨论何时使用持久订户,何时使用队列等,
  3. 如果停留在访问Hibernate / JPA POJO内容导致exception的情况下,如何解决呢?
    这导致了关于延迟加载,补充等的精彩讨论,甚至导致JPA与实体bean的比较和对比。 我发现它是有用的准备,并在概念上要清楚。
  4. 如何提供一个简单的Web服务?
    从简单的Web服务器到复杂的SOAP / REST解决scheme,以及其中的任何解决scheme都应该足够好。 另外,根据访问者的情况,有时候会引发一些非常有趣的讨论,比如一些devise思想 – 首先是WSDL,doc风格,SOAP中介等等。这可能会导致一些问题,例如JAX-WS上的JAX -RPC或SOAP1.2通过SOAP1.1,答案通常基于我记得多less。
  5. JEE 5资源注入
    这个问题有很多方面,从Service Locator模式到javax.naming.Context问题。

另一个棘手的问题,我发现令人不安的,但多次面临的是, 如何依赖库打包到档案中?
捆绑存档中的各个类的可见性。
如果讨论不会导致不同应用程序服务器,资源档案等的类加载器层次结构,最好是辞职并继续前进。

前5个核心Java问题:

  1. 关于java.util.collections的问题
    这是所有问题的母亲。 一旦你可以有效地降低面试官的面积,如果你准备好了,面试的其余部分通常会留在这里。 在这些接口的每个实现中,一定要知道SetListMap以及Object.equals()Object.hashCode()的重要性。
  2. 重构问题
    如果面试官有一个开放的心态,这很好。 如果面试官已经有了一个具体的解决scheme,而你的面试官不符合你的要求,那么你几乎注定要失败了。 最好同意答案“我了解其他解决scheme是可能的”。
  3. 与JDK版本相比,JDK5中的multithreading问题我发现最好使用java.util.concurrent包类来准备。 Doug Lea的书有大部分的答案。
  4. JDK1.6 / JDK1.7中有什么新东西?
    这是很多采访者肯定的问题。 尽pipe我讨厌这个,但最好做好准备。 至less回忆一下我曾与之合作过的一些方向的讨论,在很大程度上有效地避免和解决了这个问题。
  5. Java API中的模式
    我一再要求在Java API中指出一个GoF模式。 最好为这个做好准备。

与Web服务器和Web容器之间的区别

你最喜欢Java /最不喜欢什么?为什么?

你为什么要重写toString()方法?

一个更纯粹的Java问题:

睡眠和等待有什么区别? 实际上没有多less人知道如何等待。

你如何处理InterruptedExceptions?

这是我在面试中遇到的问题。

为什么Java中的main方法被称为public static void main(String [] args)?

回答:

1. main()必须声明为public,因为每当程序执行开始时由JVM调用它.JVM不属于我们的程序包。

为了在包外部访问main,我们必须将其声明为public。如果我们将它声明为public以外的任何东西,它将显示运行时错误,但不会显示编译时错误

2. main()必须声明为静态,因为如果一个方法被声明为静态的,那么我们可以使用ClassName.methodName()在类外部调用该方法

 class Sample { static void fun() { System.out.println("Hello"); } } class Test { public static void main(String[] args) { Sample.fun(); } } 

JVM将首先加载Test类,然后检查Commandline参数并将主方法调用为Test.main();

3. main()必须声明为void main(),因为JVM不期待main()的任何值,所以必须声明为void。

如果提供了其他返回types,则它是一个RunTimeError,即; NoSuchMethodFoundError。

4. main()必须将String参数作为数组使用,因为JVM通过传递命令行参数来调用main方法。因为它们存储在string数组对象中,所以它作为parameter passing给main()。

J2SE和J2EE(或者JSE和JEE)有什么区别?

开发者应该能够指出,企业版基本上是供应商可以实现的接口定义(即规范)。 而标准版本身就是一个实现

volatile如何影响编译器的代码优化?

怎么样的会话bean,并描述无状态和有状态会话bean之间的一些区别。

编写一个程序来接受两个整数,并将两个数字中最大的一个输出到您所选位置的文件中。 现在描述每个陈述的作用。

从导入声明的意义开始,深入到非正常终止是可能的

核心:1.什么是选中和未选中的exception? 2.在代码中添加新的exception时使用什么types(Checked / Unchecked)?

Servlet:1. response.sendRedirect()和request.forward()之间有什么区别?

threads如何工作? 什么是synchronized ? 如果一个类中有两个synchronized方法,它们可以被两个线程同时执行。 听到许多人回答是的,你会感到惊讶。 然后所有线程相关的问题,例如死锁饥饿

许多Java程序员不知道的一点是string是不可变的,所以使用StringBuilder或StringBuffer!

 String s = ""; for(int i = 0; i < 100; i++) { s += "Strings " + "are " + "immutable, " + " so use StringBuilder/StringBuffer to reduce memory footprint"; }