Java面试例题解析<二>


Java面试例题解析<二>


2.语言特性考察

通过上篇基本概念的考察,如果能够应对如上,那么面试官对你的程序设计基本功底应该是比较认可的。接下来就会加大难度,考察你对Java语言特性的掌握深度,以下考题别看耳熟能详,却很能见功底,面试者完全可以侃侃而谈一番,但如果说了半天还是没能准确道出实质的话,那么,就会给面试官留下知识的探索不够深入的印象。

此类考题重点包括:Java语言的三个特性,继承、封装、多态;反射机制;类的初始化过程。

面试例题4

Java有哪三大语言特性? 你能说下对多态的理解吗?

解析:面试官首先会问Java的三大语言特性是啥,通常情况下,这个问题90%多的人肯定都能答上来,所以考察的重点在于面试者答上来以后,再让说说对这三个特性的理解或者某一个特性的理解。通常情况下,对多态的考察更为常见,当然,面试者也要做好回答另两大特性的准备。

Java的三大语言特性是继承、封装和多态。多态可以简单地概括为“一个接口,多种方法”。在程序运行的过程中才决定调用哪个函数。通常,继承可以扩展已存在的代码模块(类),它们的目的都是为了代码重用。而多态则是为了实现另一个目的--接口重用。实际工作中,重用接口比重用代码使用得更为普遍。

面试例题5

简单说下Java的反射机制,能举例说下其应用吗?

解析:Java反射说的是在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性。对于任何一个对象,我们都能够对它的方法和属性进行调用。我们把这种动态获取对象信息和调用对象方法的功能称之为反射机制。反射被广泛地用于那些需要在运行时检测或修改程序行为的程序中。尽管反射非常强大,但也不能滥用。如果一个功能可以不用反射完成,那么最好就不用。在我们使用反射技术时,下面几条内容应该牢记于心:


1.性能第一

反射包括了一些动态类型,所以JVM无法对这些代码进行优化。因此,反射操作的效率要比那些非反射操作低得多。我们应该避免在经常被执行的代码或对性能要求很高的程序中使用反射。

2.安全限制

使用反射技术要求程序必须在一个没有安全限制的环境中运行。如果一个程序必须在有安全限制的环境中运行,如Applet,那么这就是个问题了。

3.内部暴露

由于反射允许代码执行一些在正常情况下不被允许的操作(比如访问私有的属性和方法),所以使用反射可能会导致意料之外的副作用--破坏了抽象性,降低了可移植性。

Java反射机制的应用场景,比如:

1.工厂模式:Factory类中用反射的话,添加了一个新的类之后,就不需要再修改工厂类Factory了。

2.数据库JDBC中通过Class.forName(Driver)来获得数据库连接驱动。

3.分析类文件:能得到类中的方法等等。

4.访问一些不能访问的变量或属性:破解别人代码。

面试例题6

类的初始化过程是怎样的?


解析:JVM初始化一个类包含如下几个步骤。

1.假如这个类还没有被加载和连接,则程序先加载并连接该类。

2.假如该类的直接父类还没有被初始化,则先初始化其直接父类。

3.假如类中有初始化语句,则系统依次执行这些初始化语句。

在执行第2步时,系统对直接父类的初始化步骤也遵循此步骤1~3,如果该直接父类又有直接父类,则系统再次重复这三个步骤来先初始化这个父类......所以JVM最先初始化的总是java.lang.Object类。当程序主动使用任何一个类时,系统会保证该类以及所有父类(包括直接父类和间接父类)都会被初始化。

3.实际操作考察

如果通过了对语言特性的考察,那么,接下来就要面对实际动手能力方面的考察了。

这个方面的知识点通常都是以一个非常具体的随机性的题目呈现,考题范围重点包括字符串的处理、日期函数的运用、正则表达式的运用、Java的集合。

关于字符串的处理、日期函数和正则表达式的运用,大家可前去查看本公众号系列课程《大数据分析工程师入门1-Java基础》相关部分,此类考题随机且小知识点很多,系列课程讲解的非常全面且均给出了示例,足以满足大家应试要求,所以这里将不再赘述。

接下来会带领大家重点挖掘一下Java集合相关的考题。

面试例题7

你需要存储元素到某种数据结构中,而且要确保元素在自然队列中没有重复,下面哪个接口能保证这种能力?

A. java.util.Map

B. java.util.List

C. java.util.Collection

D. java.util.Set

解析:要想正确回答这个问题,面试者需要对Java集合有一个清晰的脉络。

Java容器类库一共有两种主要类型:Collection和Map。它们之间的区别在于容器内每个“槽”所存储的元素个数不同,Collection每个槽内只能存储一个元素,而Map类型中,每个槽内存储key-value关联。Java容器类都可以自动调整自己的尺寸。

<code>Collection的子类:
① --List:以特定次序存储元素,取出来的顺序可能和放入的顺序不同
|--ArrayList:擅长随机访问元素,但在List中进行插入、删除和移动元素较慢
|--LinkedList:插入、删除、移动元素方便,但随机访问元素差
② --Set:每个值只能保存一个对象,不能包含重复的元素
|--HashSet:使用散列函数
|--TreeSet:使用红黑树
|--LinkedHashSet:使用链表结合散列函数
③ --Queue:先进先出的容器

Map的子类:
① --HashMap:使用散列函数
② --HashTable:使用散列函数
③ --TreeMap:使用红黑树/<code>

故答案选D。

对每个容器子类的特性上图已做简单说明,但如果要应对面试官的继续追问,考察更为细节性的知识点,那么,面试者最好要对每个子类的特性有一个更全面更深入的学习和总结,一般实际动手操作过的面试者对此类问题的认识会更为深刻。比如,以前经常会被问到的考题,请说明HashMap和HashTable的区别。不能说出个两三点,那是很难让面试官满意的,因为如果你实际操作过,通常会有很深的体会和印象。

(PS:现在由于HashTable的概念基本完全淡化了,该问题应该会很少再被问到了,举此案例是为了说明面试官会出类似题型来进行深入考察面试者动实际操作情况,面试者需要深入学习总结。)


分享到:


相關文章: