2020年基础面试题.pdf





《2020年基础面试题.pdf》由会员分享,可在线阅读,更多相关《2020年基础面试题.pdf(128页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、2020年基础面试题面向对象编程(O O P)J a v a是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点:代码开发模块化,更易维护和修改。代码复用。增强代码的可靠性和灵活性。增加代码的可理解性。面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象。下面的章节我们会逐个分析这些特性。封装封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其它对象访问的方法来改变它内部的数据。在J a v a当中,有3种修饰符:p u b l i c,p r i v a t e和p r o t e c t e d o每一种修饰符给其它的位于同一个包或者不同包下面对
2、象赋予了不同的访问权限。下面列出了使用封装的一些好处:通过隐藏对象的属性来保护对象内部的状态。提高了代码的可用性和可维护性,因为对象的行为能够被单独的改变或者是扩展。禁止对象工间的不良交互提高模块化。参考这个文档获取更多关于封装的细节和示例。多态多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作能够应用到其它类型的值上面。继承继承给对象提供了从基类获取字段和方法的能力。继承提供了代码的重用行,也能够在不修改类的情况下给现存的类添加新特性。抽象抽象是把想法从具体的实例中分离出来的步骤,因此,要根据他们的功能而不是实现细节来创建类。J a v a 支持创建只暴漏接口
3、而不包含方法实现的抽象的类。这种抽象技术的主要目的是把类的行为和实现细节分离开。抽象和封装的不同点抽象和封装是互补的概念。一方面,抽象关注对象的行为。另一方面,封装关注对象行为的细节。一般是通过隐藏对象内部状态信息做到封装,因此,封装能够看成是用来提供抽象的一种策略。常见的Java问题?为什么J a v a 被称作是“平台无关的编程语言”?J a v a 虚拟机是一个能够执行J a v a 字节码的虚拟机进程。J a v a 源文件被编译成能被J a v a 虚拟机执行的字节码文件。J a v a 被设计成允许应用程序能够运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。J
4、a v a 虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其它特性。?J a v a 运行时环境(J R E)是将要执行J a v a 程序的J a v a 虚拟机。它同时也包含了执行 a p p l e t 需要的浏览器插件。J a v a 开发工具包(J DK)是完整的J a v a 软件开发包,包含了 J R E,编译器和其它的工具(比如:J a v a Do c,J a v a 调试器),能够让开发者开发、编译、执 行 J a v a 应用程序。3.“s t a t i c”关键字是什么意思?J a v a 中是否能够覆盖(o v e r r i d e)一个p r i v
5、a t e或者是s t a t i c 的方法?“s t a t i c”关键字表明一个成员变量或者是成员方法能够在没有所属的类的实例变量的情况下被访问。J a v a 中s t a t i c 方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而s t a t i c 方法是编译时静态绑定的。s t a t i c 方法跟类的任何实例都不相关,所以概念上不适用。?s t a t i c 变量在J a v a 中是属于类的,它在所有的实例中的值是一样的。当类被J a v a 虚拟机载入的时候,会对s t a t i c 变量进行初始化。如果你的代码尝试不用实例来访问非s t a t i c
6、的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。?什么是自动拆装箱?J a v a 语言支持的8 中基本数据类型是:b y t e s h o r t i n t l o n g f l o a t d o u b l e b o o l e a n c h a r自动装箱是J a v a 编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把i n t 转化成I n t e g e r,d o u b l e 转化成d o u b l e,等等。反之就是自动拆箱。(O v e r r i d i n g)和方法重载(O v e r l o a d i
7、n g)是什么意思?J a v a 中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。,什么是构造函数?什么是构造函数重载?什么是复制构造函数?当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,J a v a 编译器会为这个类创建一个默认的构造函数。J a v a 中构造函数重载和方法重载很相似。能够为一个类创建多个构造函数。每一个构造函数必须有它自己唯一的参数列表。J a v a
8、 不支持像C+中那样的复制构造函数,这个不同点是因为如果你不自己写构造函数的情况下,J a v a 不会创建默认的复制构造函数。不支持,J a v a 不支持多继承。每个类都只能继承一个类,但是能够实现多个接口。J a v a 提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的。而抽象类则能够同时包含抽象和非抽象的方法。类能够实现很多个接口,但是只能继承一个抽象类 类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类能够不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。抽象类能够在不提供接口方法实现的情况下实现接口。J
9、 a v a 接口中声明的变量默认都是f i n a l 的。抽象类能够包含非f i n a l 的变量。J a v a 接口中的成员函数默认是p u b l i c 的。抽象类的成员函数能够是p r i v a t e,p r o t e c t e d 或者是 p u b l i c。接口是绝对抽象的,不能够被实例化。抽象类也不能够被实例化,但是,如果它包含m a i n 方法的话是能够被调用的。也能够参考J DK 8中抽象类和接口的区别?对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用
10、。因此,外部对引用对象所做的改变会反映到所有的对象上。J a v a线程进程是执行着的应用程序,而线程是进程内部的一个执行序列。一个进程能够有多个线程。线程又叫做轻量级进程。?你喜欢哪一种?为什么?有三种方式能够用来创建线程:继 承T h r e a d类 实 现R u n n a b l e接口 应用程序能够使用Ex e c u t o r框架来创建线程池实 现R u n n a b l e接口这种方式更受欢迎,因为这不需要继承T h r e a d类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而J a v a不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和
11、使用。线程在执行过程中,能够处于下面几种状态:就绪(R u n n a b l e):线程准备运行,不一定立马就能开始执行。运行中(R u n n i n g):进程正在执行线程的代码。等待中(W a i t i n g):线程处于阻塞的状态,等待外部的处理结束。睡眠中(S l e e p i n g):线程被强制睡眠。I/O 阻塞(B l o c k e d o n I/O):等待I/O 操作完成。同步阻塞(B l o c k e d o n S y n c h r o n i z a t i o n):等待获取锁。死亡(De a d):线程完成了执行。?在 J a v a 语言中,每一个对
12、象有一把锁。线程能够使用s y n c h r o n i z e d 关键字来获取对象上的锁。s y n c h r o n i z e d 关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。(M o n i t o r)内部,是如何做线程同步的?程序应该做哪种级别的同步?监视器和锁在J a v a 虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。(d e a d l o c k)?两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无
13、限的等待中。使用多线程的时候,一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。Java集合类?集合类接口指定了一组叫做元素的对象。集合类接口的每一种具体的实现类都能够选择以它自己的方式对元素进行保存和排序。有的集合类允许重复的键,有些不允许。J a v a 集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。J a v a集合类里面最基本的接口有:C o l l e c t i o n:代表一组对象,每一个对象都是它的子元素。S e t:不包含重复元素的C o l l e c t i
14、 o n。L i s t:有顺序的c o l l e c t i o n,并且能够包含重复元素。M a p:能够把键(k e y)映射到值(v a l u e)的对象,键不能重复。克隆(c l o n i n g)或者是序列化(s e r i a l i z a t i o n)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。(I t e r a t o r)?I t e r a t o r 接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了能够返回迭代器实例的迭代方法。迭代器能够在迭代的过程中删除底层集合的元素。?下面列出了他们的区别:I
15、 t e r a t o r 可用来遍历S e t 和 L i s t 集合,但是L i s t i t e r a t o r 只能用来遍历 L i s t。I t e r a t o r 对集合只能是前向遍历,L i s t i t e r a t o r 既能够前向也能够后向。L i s t i t e r a t o r 实现了 I t e r a t o r 接口,并包含其它的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。(f a i l-f a s t)和安全失败(f a i l-s a f e)的区别是什么?I t e r a t o r 的安全失败是基于对
16、底层集合做拷贝,因此,它不受源集合上修改的影响。快速失败的迭代器会抛出C o n c u r r e n t M o d i f i c a t i o n Ex c e p t i o n 异常,而安全失败的迭代器永远不会抛出这样的异常。J a v a 中的H a s h M a p 是以键值对(k e y-v a l u e)的形式存储元素的。H a s h M a p 需要一个 h a s h 函数,它使用h a s h C o d e()和 e q u a l s。方法来向集合/从集合添加和检索元素。当调用p u t ()方法的时候,H a s h M a p 会计算k e y 的h
17、a s h 值,然后把键值对存储在集合中合适的索引上。如果k e y 已经存在了,v a l u e 会被更新成新值。H a s h M a p 的一些重要的特性是它的容量(c a p a c i t y),负载因子(l o a d f a c t o r)和扩容极限(t h r e s h o l d r e s i z i n g)o()和 e q u a l s。方法的重要性体现在什么地方?J a v a 中的H a s h M a p 使用h a s h C o d e()和 e q u a l s。方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两
18、个方法,两个不同的键可能会有相同的h a s h 值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对H a s h M a p 的精确性和正确性是至关重要的。H a s h M a p 和 H a s h t a b l e 都实现了 M a p 接口,因此很多特性非常相似。但是,他们有以下不同点:H a s h M a p 允许键和值是n u l L 而 H a s h t a b l e 不允许键或者值是n u l l。H a s h t a b l e 是同步的,而 H a s h M a p 不是。因此,H a s h M a p 更适合于单
19、线程环境,而 H a s h t a b l e 适合于多线程环境。H a s h M a p 提供了可供应用迭代的键的集合,因此,H a s h M a p 是快速失败的。另一方面,H a s h t a b l e 提供了对键的列举(En u m e r a t i o n)。O 一般认为H a s h t a b l e 是一个遗留的类。(A r r a y)和列表(A r r a y L i s t)有什么区别?什么时候应该使用A r r a y 而不是A r r a y L i s t?下面列出了 A r r a y 和 A r r a y L i s t 的不同点:A r r a
20、y 能够包含基本类型和对象类型,A r r a y L i s t 只能包含对象类型。A r r a y 大小是固定的,A r r a y L i s t 的大小是动态变化的。A r r a y L i s t 提供了更多的方法和特性,比如:a d d A l l(),r e m o v e A l l(),i t e r a t o r ()等等。对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。A r r a y L i s t 和 L i n k e d L i s t 都实现了 L i s t 接口,他们有以下的不同点:A
21、 r r a y L i s t 是基于索引的数据接口,它的底层是数组。它能够以0(1)时间复杂度对元素进行随机访问。与此对应,L i n k e d L i s t 是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是0(n)。相对于A r r a y L i s t,L i n k e d L i s t 的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。L i n k e d L i s t 比A r r a y L i s t 更占内存,因为L i n k
22、 e d L i s t 为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。也能够参考 A r r a y L i s t vs.L i n k e d L i s t?列出它们的区别。J a va 提供了只包含一个c o m p a r e T o()方法的C o m p a r a b l e 接口。这个方法能够个给两个对象排序。具体来说,它返回负数,0,正数来表明输入对象小于,等于,大于已经存在的对象。J a va 提供了 包含 c o m p a r e。和 e q ua l s ()两个方法的 C o m p a r a t o r 接口 0 c o m p a r
23、 e。方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。e q ua l s。方法需要一个对象作为参数,它用来决定输入参数是否和c o m p a r a t o r 相等。只有当输入参数也是一个c o m p a r a t o r 并且输入参数和当前c o m p a r a t o r 的排序结果是相同的时候,这个方法才返回t r ue。(P r i o r i t y Q ue ue)?P r i o r i t y Q ue ue 是一个基于优先级堆的无界队列,它的元素是按照自然顺序(n a t ur a l o r d e r)排序的。在创建
24、的时候,我们能够给它提供一个负责给元素排序的比较器。P r i o r i t y Q ue ue 不允许n ul l 值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,P r i o r i t y Q ue ue 不是线程安全的,入队和出队的时间复杂度是0(1。晨n)。(b i g-0 n o t a t i o n)么?你能给出不同数据结构的例子么?大0符号描述了当数据结构里面的元素增加的时候,算法的规模或者是性能在最坏的场景下有多么好。大0符号也可用来描述其它的行为,比如:内存消耗。因为集合类实际上是数据结构,我们一般使用大。符号基于时间,内存和性能来选择最好的实现。
25、大0符号能够对大量数据的性能给出一个很好的说明。有序数组最大的好处在于查找的时间复杂度是O(l o g n),而无序数组是0(n)。有序数组的缺点是插入操作的时间复杂度是0(n),因为值大的元素需要往后移动来给新元素腾位置。相反,无序数组的插入时间复杂度是常量0(1)。根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我们就应该用A r r a y而不是A r r a y L i s t。有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们能够设置初始容量来避免重新计算h a s h值或者是扩容。为了类型变全,可读性和健壮
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2020 基础 试题

限制150内