每个优秀的 Java/JavaEE 开发人员都应该能够回答的问题?

我正在阅读 每个问题。网络开发人员应该能够回答,对这个问题的内容和方法印象深刻,因此本着同样的精神,我为 Java/JavaEE 开发人员提出这个问题。

你认为一个优秀的 Java/JavaEE 程序员应该能够回答哪些问题?

我将这个问题标记为社区 wiki,因为它不是特定于用户的,它的目标是服务于整个编程社区。

期待一些惊人的回应。

编辑 : 也请按照评论中的建议回答问题,这样人们也可以学到一些关于语言的新东西。

199630 次浏览

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

Set,Map 和 List 有什么区别?

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

描述内部类的“四种”(而不是三种;)类型之间的差异。

陷阱问题: 在 Java 中什么类型的参数是通过引用传递的?

令人惊讶的是,仍然有很多人重复着“原语是通过值传递的,对象是通过引用传递的”这样的口头禅。

线程安全类和显式同步代码的优点和缺点以及两者的良好应用示例。信任线程安全类作为多线程应用程序中数据一致性的保证通常是不正确的。

在方法调用中使用 期末考试关键字。 例如,为什么下面代码中的方法 < b > 测试 没有给出任何编译错误,尽管对方法参数使用了 期末考试限定符。

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");
}

http://www.techinterviews.com/interview-questions/java上有很多问题和访谈,我并不认为拷贝或粘贴一些问题和访谈有什么价值。

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

尽管如此,我最喜欢的问题是“你不喜欢 Java 的哪些地方?”(本着 这个的精神)。这确实是一个非常好的问题,它可以给你一个即时的反馈,告诉你一个候选人使用 Java 和探索它的 API 的程度,以及他是否只是虔诚地信仰它(正如 OP 所写的那样)。

更新: 正如 CPerkins 所建议的,对于上面提到的问题,一个更好的措辞可能是“你最希望看到 Java 发生什么变化?”.事实上,我更喜欢这样。

一些简单的问题,比如,

  • 什么是 JRE 和 JDK?
  • 为什么 Java 声称具有互操作性?

尽管这些都是非常基本的,但许多开发人员并不知道答案。我建议在进行与代码相关的查询之前询问这些问题。

System.out.println 中的“ System”、“ out”、“ println”是什么? 在 HashMap 上调用“ put”时会发生什么?

那么什么是会话 bean 呢? 请描述无状态会话 bean 和有状态会话 bean 之间的一些区别。

如果你正在招聘具有 Java“经验”的毕业生,一个像 编写一些会引发 NullPointerException 的代码这样的简单问题就可以区分哪些应聘者最近使用过 Java,而不是在他们完成单元/课程后就停止使用。

一个可以肯定的是字符串的比较

字符串 helloWorld = “ Hello World”;
HelloWorld = = “ Hello World”;
等于(helloWorld) ;

  1. 解释 Java 中使用的各种访问修饰符。
  2. 如果可以改变 Java 语言或平台的一个特性,那会是什么?优秀的开发人员会在这里找到答案,而那些对开发不感兴趣的人可能并不在乎。
  3. 如果他们的简历上有类似于使用 EJB2.1的内容,那么问问 EJB3,看看他们对 EJB3了解多少。即使最好的开发人员不使用最新的版本,他们也会跟上最新的开发。

“部署描述符是什么?”

如果候选人不由自主地颤抖,那么他有使用3.0之前的 EJB 的经验。

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

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

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

所以你(自己)在面试中学到了一些东西,你向面试官展示了你能够推理类、对象、继承、多态性等等。实际上,这比一个知道答案却不明白原因的候选人要好得多

  • 当重写等于时,总契约是什么?
  • 更好的选项是更喜欢列表还是数组?
  • 普遍接受的命名约定是什么?
  • 序列化是如何工作的?
  • 如何实现可比性?
  • 使用 JDBC 的准备语句有哪些优点?
  • 什么是 JavaEE?
  • 什么是容器,它提供什么服务?

Web 服务器与 Web 容器的区别

你说“好”,“开发商”。这是我的2美分也. . :)

  • “检查异常”是什么意思?
  • 何时使用哪一个更好: 处理意外情况的断言还是异常?
  • 为什么 String 类是 final 的? (或者不是? ;)
  • 对象类中的 wait、 notifyAll 方法是什么?
  • 为什么 Thread 类不是最终类? 为什么我要扩展 Thread?
  • 为什么有两个 Date 类: 一个在 java.util 包中,另一个在 java.sql 中?
  • 如果在 finally 块中抛出异常会发生什么情况? 是否最终执行剩余的异常?
  • 确实有一个垃圾收集器,但是在 Java 应用程序中是否完全没有内存泄漏呢?如果不是,那是为什么?

对于 J2EE:

  • 在 servlet 中有实例/静态变量好吗? 为什么不呢? 那么在哪里存储“状态”呢?
  • 继续上面的问题: 什么是(web)应用程序的“状态”?
  • 如果我开始在“ JSP”中创建/关闭 DB 连接会发生什么?
  • 处理 JSP 异常的方法有哪些? try-catch? 嗯... ... 还有别的吗?

我能想到很多,很多,很多,但是现在这个就够了:)

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

关于 Java,你最喜欢/最不喜欢的是什么? 为什么?

抽象类和接口的区别是什么? 什么时候使用它们?

很多 Java 开发人员不知道这一点,我在大学计算机科学课程上问过大多数人,绝大多数人都不能回答。

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

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

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

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

String、 StringBuffer 和 StringBuilder 有什么区别?

何时使用会话 Bean 或消息驱动 Bean?

如何在会话 bean 中处理事务?

本地会话 bean 和远程会话 bean 的区别是什么?这个问题更多的是关于知道 RPC 是否在图片中,因为同时暴露为 Local 或 Remote 的方法可能仍然有不同的工作方式(参数的副作用在 Locals 中是可能的,而在 Remotes 中是不可能的)。

一个好的测试是: 永远不要按照同样的顺序问问题。我们在离岸外包方面的经验是,有时他们实际上是以错误的顺序作出反应:。因此,你应该确保你能真正看到你正在审问的人。

一个更纯粹的 Java 问题:

睡眠和等待的区别是什么? 没有多少人真正理解等待是如何起作用的。

您需要如何处理中断异常?

给出一个真实的例子场景,你将使用 GenericServlet 而不是 HttpServlet?

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

可以从 import 语句的重要性开始,深入到异常终止

将印刷什么?

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

核心: 1. 什么是已检查和未检查的异常? 2. 在代码中添加新异常时,何时使用何种类型(Checked/Uncheck) ?

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

许多 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";
}

前5个 J2EE/JEE 问题

我遇到的 J2EE/JEE 中间件问题的清单非常长,但是下面是我被问到的前5个问题,这些问题引发了很好的讨论:

  1. 当 MDB 遇到它无法处理的异常时会发生什么?
    这个问题通常会引发关于有害消息、错误队列等等的各种有趣的讨论,
  2. 给定一个 JMS Topic,以及不同 JVM 上的一些使用者,就有关持久使用者和没有持久使用者的各种场景提出问题。
    这个问题通常允许我讨论什么时候使用持久订户,什么时候使用队列等等,
  3. 如果在访问 Hibernate/JPA POJO 内容导致异常的情况下陷入困境,那么如何解决这个问题呢?
    这导致了关于延迟加载、再水合等的精彩讨论,甚至导致了 JPA 与 Entity bean 的比较和对比。我发现做好准备,明确概念是很有用的。
  4. 如何提供简单的 Web 服务?
    从简单的基于 Web 服务器的解决方案到复杂的 SOAP/REST 解决方案,以及介于两者之间的任何解决方案,都应该足够好了。此外,基于访问者,有时它会引发一些非常有趣的话题讨论,比如一些设计思想—— WSDL 优先、 doc 风格、 SOAP 中介等等。它可能会引发一些问题,比如列出 JAX-WS 相对于 JAX-RPC 的改进,或者列出 SOAP1.2相对于 SOAP1.1的改进,这些问题的答案通常基于我的记忆力。
  5. JEE 5资源注入
    服务定位器模式到 javax.naming.Context问题,这个问题以多种方式提出。

另一个棘手的问题,我发现麻烦,但面对了很多次是, 如何将依赖库打包成归档文件?
或 < strong > 捆绑存档中各种类的可见性。

如果讨论没有导致不同应用程序服务器、资源归档等的类装入器层次结构,那么最好退出并继续讨论。

Java 的5大核心问题:

  1. 关于 java.util.Collection 的问题
    这是所有问题的根源。一旦你可以有效地 陆地面试官在这个领域,如果你准备好了,其余的面试通常留在这里。确保了解 SetListMap以及 Object.equals()Object.hashCode()在这些接口的每个实现中的重要性。
  2. 重构问题
    如果面试官思想开放的话,这些都很好。如果面试官已经有了一个具体的解决方案,而你的方案与他/她的方案不匹配,那么你注定要失败。最好同意这样的回答: “我知道其他解决方案是可能的。”
  3. 与早期 JDK 版本相比,关于 JDK5中多线程的问题 我发现最好是准备与 并发包类。Doug Lea 的书里有大部分的答案。
  4. JDK1.6/JDK1.7有什么新东西... ?
    对于很多面试官来说,这是一个十拿九稳的问题。虽然我很讨厌这样,但最好做好准备。至少记住一些我曾经与之共事过的人,并且引导讨论向其他方向发展,这样就可以在很大程度上有效地回避和解决问题。
  5. JavaAPI 中的模式
    一次又一次地,我被要求指出 JavaAPI 中的 GoF 模式。最好做好准备。

这是我在面试中面对的问题。

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

回答:

1. Main ()必须声明为公开,因为每当程序执行 starts.JVM 不属于我们的程序包时,JVM 就会调用它。

为了访问包外的 main,我们必须将其声明为 public。如果我们将其声明为 public 以外的任何形式,它将显示 < em > 运行时错误 而不是 编译时间错误

2. Main ()必须声明为 static,因为如果一个方法声明为 static,那么我们可以使用 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。

如果提供了其他返回类型,则为 RunTimeError 即 NoSuchMethodFoundError。

4.因为 JVM 通过传递命令行参数来调用 main 方法。

很好的问题和很好的答案,很高兴看到这样的问题。 我想添加一些更多的内容,使这个答案库更加丰富。

用于核心 Java Main 是 Java 中的关键字吗? 更多信息

Java 是独立于平台的,那么 JVM 呢?

我们可以在类中使用私有构造函数吗? 如果可以,它的用法是什么。

为什么我们需要在抽象类的构造函数,虽然我们不能实例化它? 更多信息

除了以上这些,还有更多与核心 java.更多信息相关的问题