我正在研究每一个好的.Net开发人员应该能够回答的问题,并且对该问题的内容和方法印象深刻,因此,本着同样的精神,我正在向Java / Java EE开发人员提出这个问题。
有什么问题你认为应在良好的Java / Java EE的程序员能够回答?
我将此问题标记为社区Wiki,因为它不是特定于用户的,并且旨在为整个编程社区提供服务。
期待一些惊人的回应。
编辑:也请按照评论中的建议回答问题,以便人们也可以学习有关该语言的新知识。
我正在研究每一个好的.Net开发人员应该能够回答的问题,并且对该问题的内容和方法印象深刻,因此,本着同样的精神,我正在向Java / Java EE开发人员提出这个问题。
有什么问题你认为应在良好的Java / Java EE的程序员能够回答?
我将此问题标记为社区Wiki,因为它不是特定于用户的,并且旨在为整个编程社区提供服务。
期待一些惊人的回应。
编辑:也请按照评论中的建议回答问题,以便人们也可以学习有关该语言的新知识。
Answers:
hashCode()和equals()之间是什么关系?这些方法的意义是什么?实施这些要求有哪些要求?
Set,Map和List有什么区别?
我仍然感到惊讶的是,有多少人在电话采访中不认识这一个人。
一个接口可以扩展多个接口吗?
大多数人回答“否”,因为他们知道Java没有多重继承。但是一个接口仍然可以扩展多个接口(但是一个类不能扩展多个类)。这不会导致钻石问题。
如果答案是“否”,面试官要问“为什么会是被禁止?”。然后您开始考虑它,您应该意识到它没有问题。
因此,您在面试中(自己)学到了一些东西,并向面试官展示了您能够推理类,对象,继承,多态性等方面的知识。实际上,这比一个心地知道答案但不知道答案的候选人要好得多。明白为什么
在方法调用中使用final关键字。例如,为什么尽管在方法参数中使用了最终限定符,但下面的代码中的方法测试为什么没有给出任何编译错误。
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");
}
final
关键字应用于Name
对象,而不是name
类的字段Name
n
被声明为final,这意味着它不能在test
方法主体中重新分配。它不会导致错误,因为该方法test
不会尝试重新分配参数,它只是在参数上设置属性... n = new Name("test");
会导致编译错误...
一种确定是比较字符串。之间的区别
字符串helloWorld =“ Hello World”;
helloWorld ==“ Hello World”;
“ Hello World” .equals(helloWorld);
技巧问题:Java中通过引用传递了哪些参数?
令人惊讶的是,还有多少人仍然模仿“基元通过值传递,对象通过引用传递”的口头禅。
您说“好”,“开发人员”。这也是我的2美分.. :)
对于J2EE:
我可以想到还有很多很多其他功能,但现在就可以了:)
String,StringBuffer和StringBuilder有什么区别?
许多问题和访谈都可以在http://www.techinterviews.com/interview-questions/java上获得,我真的不认为复制/粘贴其中的内容会有价值。
不,这是你来创建你自己的东西编译你认为是很重要的。就我个人而言,我总是分两个步骤进行:首先是几个问题,以获取有关经验和技能的基本概念,然后是解决问题的情况。我确实不相信能够回答任何已知问题会使您成为好问题或不好的未知问题解决者。因此,我更愿意要求人们解决给定的问题,给他们一些要求,并要求他们编写代码(但不是在纸上)。我给他们一些时间来找我,检查他们是如何做到的,他们的编码风格,他们如何使用建议的API等。
综上所述,我最喜欢的问题是“您不喜欢Java什么?” (本着这个精神)。这确实是一个很好的问题,它为您提供了有关候选人使用Java并探索其API的程度以及他是否只是出于宗教信仰的即时反馈(如OP所写)。
更新:正如CPerkins所建议的那样,上面建议的问题的措辞更好的措词可能是“您最想看到Java发生了什么变化?”。确实,我更喜欢这种方式。
new
或^
或>>
,<<
和>>>
)。如果我可以更改另一件事,那就是添加真正的按引用调用语义。第三件事是添加unsigned
整数类型。
如果您正在使用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开发人员都不知道这一点,我在大学的计算机科学课程中问过大多数人,而绝大多数人都无法回答。
简单的问题,例如,
尽管这些是非常基础的,但许多开发人员都不知道答案。我建议在与代码相关的查询之前询问这些问题。
我遇到的J2EE / JEE中间件问题列表非常长,但是以下是我被问到的前5个问题,并引起了很好的讨论:
javax.naming.Context
问题,提出问题的方式很多。我发现另一个令人费解的棘手问题,但遇到了很多次,那就是,
依赖库如何打包到存档中?
或捆绑归档中各个类的可见性。
如果讨论没有导致不同应用程序服务器,资源档案库等的类加载器层次结构,那么最好辞职并继续。
Set
,List
,Map
,和的重要性Object.equals()
,并Object.hashCode()
在这些接口的每个实施。这是我在面试中遇到的问题。
为什么在Java中将main方法称为public static void main(String [] args)?
回答:
1. main()必须声明为public,因为只要程序开始执行,JVM就会调用main()。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。
如果提供其他返回类型,则为RunTimeError,即; NoSuchMethodFoundError。
4. main()必须将String参数作为数组,因为JVM通过传递命令行参数来调用main方法。由于它们存储在字符串数组对象中,因此作为参数传递给main()。
public static void main(String... args)
如果您倾向的话可以使用:-)它的签名与[]
J2SE和J2EE(或JSE和JEE)之间有什么区别?
开发人员应该能够指出,企业版基本上是可以由供应商实施的接口定义(即规范)。标准版本身就是一个实现
如何volatile
影响编译器的代码优化?
核心:1.什么是检查异常和未检查异常?2.在代码中添加新异常时,何时使用哪种类型(已检查/未检查)?
Servlet:1. response.sendRedirect()和request.forward()有什么区别?
threads
工作如何?什么synchronized
啊 如果synchronized
一个类中有两个方法,它们可以同时由两个线程执行。听到很多人回答是,您会感到惊讶。然后是所有与线程相关的问题,例如死锁,饥饿等。
thread
正在运行该方法,则其他任何人thread
都无法获得该锁。
许多Java程序员不知道的一件事是字符串是不可变的,因此请使用StringBuilder或StringBuffer!
String s = "";
for(int i = 0; i < 100; i++) {
s += "Strings " + "are " + "immutable, " + " so use StringBuilder/StringBuffer to reduce memory footprint";
}
s += "a" + "b" + "c"
变成一个Stringbuilder.append(...)
场景。但是它不会优化for
循环。此答案中的代码最终将char[]
在这些StringBuilder中创建总共201个String,100个StringBuilder,以及(取决于实现)300个不同的s,并估计包含425k +个字符。完全将其更改为使用StringBuilder会将其减少为1个String,1个StringBuilder和13-15个内部char[]
s ,而仅使用〜8k个字符,而不是应该的。