Java面试题及回答.docx
《Java面试题及回答.docx》由会员分享,可在线阅读,更多相关《Java面试题及回答.docx(33页珍藏版)》请在冰豆网上搜索。
Java面试题及回答
关于Java普通问题
1.什么是JVM?
为什么称Java为跨平台编程语言?
Java虚拟机(JavaVirtualMachine)是可以执行Java字节码虚拟机,每个Java源文献将被编译成字节码文献,然后在JVM中执行。
Java之因此被设计成可以在任意平台运营,而不需要重写或者在不同平台下重新编译,这些都要归功于Java虚拟机(JVM),由于JVM非常理解特定指令长度以及底层硬件平台特殊性。
2.JDK和JRE之间差别是什么?
Java运营环境(JavaRuntimeEnviroment)是运营Java程序基本Java虚拟机,涉及执行applet浏览器插件。
JDK(JavaDevelopmentKit)是为了开发,编译和执行Java应用程序,针对Java全功能软件开发包,包括了JRE,编译器和工具(例如说 JavaDoc 和JavaDebugger)。
3.“static”核心字是什么意思?
在Java里可以overrideprivate或static办法吗?
keywordmean?
CanyouoverrideprivateorstaticmethodinJava?
static核心字表达,访问这个成员变量或办法时,不必获取它属于类实例。
Java里static办法不能被override,由于override机制是运营时(runtime)动态绑定,而static办法是在编译时静态绑定。
static办法并不与任何类详细实例关于,因而无法应用继承概念。
4.在静态办法里可以访问非静态变量吗?
Java 中static变量归相应类所有,它值对于类所有实例都是相似。
static变量是在JVM加载类时候初始化。
如果代码试图访问非静态变量,并且不是通过类实例去访问,编译器会报错,由于这些非静态变量还没有被创立呢,并且它们没有与实例有关联。
顶
5.Java支持哪些数据类型?
什么是Autoboxing和Unboxing?
Java语言支持8个基本数据类型如下:
∙byte
∙short
∙int
∙long
∙float
∙double
∙boolean
∙char
Autoboxing是指在基本数据类型和相应包装(wrapper)类之间Java编译器所做自动转换。
例如,编译器将int转换为 Integer,将 double转换为 Double ,等等。
逆向转换称为unboxing。
6.在Java中什么是办法 Override(覆盖)和Overload(重载)?
Java中办法overload发生条件是,同一种类里,有两个或以上办法名称完全相似,但参数列表不同。
另一方面,办法override是指,子类重定义了父类里同一种办法。
Override办法必要办法名、参数列表和返回类型都完全相似。
Override办法不会限制原办法访问权限。
7.Java中构造函数、构造函数重载概念和拷贝构造函数
当类对象被创立时候,调用它构造函数。
每个类均有一种构造函数。
如果程序员没有为类编写构造函数,Java编译器自动为类创立一种缺省构造函数。
构造函数重载和Java中函数重载类似,可觉得同一种类创立不同构造函数,每个构造函数必要拥有唯一参数列表。
Java与C++不同,它不支持拷贝构造函数,但是区别仅仅是,如果你没有编写类拷贝构造函数,Java不会自动创立它。
8.Java支持多继承吗?
Java不支持多继承,每个类只容许继承一种类,但是可以实现各种接口。
9.接口和抽象类有什么不同?
Java同步提供和支持抽象类和接口,它们实既有某些共同特点,也有如下不同:
∙接口中所有办法默认都是抽象,而抽象类可以同步包括抽象和非抽象办法。
∙一种类可以实现各种接口,但它只能继承一种抽象类。
∙一种类要实现某个接口,必要实现这个接口声明所有办法。
而一种类不需要实现抽象父类中声明所有办法,但是,这时候这个类也必要声明为抽象类。
∙抽象类可以实现接口,并且不需要实现接口中办法。
∙接口中声明变量默认是final,而抽象类可以包括非final变量。
∙接口中成员默认是public,而抽象类成员可以是private,protected,或public。
∙接口是绝对抽象,不可实例化,抽象类也不可以实例化,但可以在main办法中触发实例化(注:
通过匿名类实现)。
也可以查阅 AbstractclassandInterfacedifferencesforJDK8 。
10.传引用和传值
当对象通过传值调用时,传递是这个对象一种拷贝。
因而,虽然函数修改这个对象,也不会影响原对象值。
当对象通过传引用调用时,对象自身没有被传递,而传递是对象一种引用。
因而,外部函数对这个对象修改,也会反映到任何浮现这个对象地方。
Java线程
11.进程与线程区别?
进程是一种程序执行(即正在运营程序),然而线程是在进程中独立执行序列.一种进程可以包括诸多线程.线程有时被称为轻量级进程.
12.说下创立线程不同方式.你倾向于哪种方式并阐明因素?
有三种创立线程方式:
∙继承Thread类.
∙实现Runnable接口.
∙通过Executor框架创立线程池.
首选方式是实现Runnable接口,由于它不需要继承Thread类.当你程序设计需要多继承时,使用接口会有所协助.此外,线程池效率是很高,并且实行起来也很简朴.
13.解释下可用线程状态.
在执行期间,线程会处在如下状态中一种:
∙Runnable:
线程已准备就绪,但没有及时运营.
∙Running:
解决器正在执行线程代码.
∙Waiting:
处在阻塞状态线程,等待外部某种解决结束.
∙Sleeping:
被强制休眠线程.
∙BlockedonI/O:
等待I/O操作完毕.
∙BlockedonSynchronization:
等待获得线程锁.
∙Dead:
线程已经执行结束.
14.同步办法与同步块区别?
在Java程序中,每个对象都拥有一种锁.线程可以通过使用synchronized核心字来获取一种对象上锁.synchronized核心字可以用于办法级别(粗粒度锁)或代码块级别(细粒度锁).
15.在监视器中线程同步是如何发生?
你可以使用哪些级别同步?
JVM使用结合了监视器锁.监视器是一种守护者,它看守一种同步代码序列,并且保证在一种时刻只能有一种线程执行同步代码片段.每个监视器关联着一种对象引用.只能得到锁线程才可以执行同步代码.
16.什么是死锁?
当两个进程互相等待对方执行完毕时,其成果是它们会永远等待下去.
17.如何保证N个线程访问N个资源时不会发生死锁?
使用N个线程时一种非常简朴避免死锁办法是为所有锁排序,并强制每个线程也按那种方式排序.这样,如果所有线程以相似顺序锁定和解锁互斥资源就不会发生死锁了.
JavaCollections
18.JavaCollections框架基本接口?
JavaCollections框架 提供了一系列支持对象集合操作设计良好接口和类.JavaCollections框架中最基本接口是:
∙Collection,表达一组对象(元素).
∙Set,包括非重复元素集合.
∙List,包括非重复元素有序集合.
∙Map,包括非重复键键值对对象.
19.为什么Collection没有继承Cloneable和Serializable接口?
Collection接口描述是由元素构成对象组.Collection每一种详细实现可以选取自己方式来管理元素.某些集合容许存在重复键,另某些则不容许.
当解决实际实现时复制和序列化语义和效果才会起作用.因而,集合类详细实现应当决定它们将如何被复制和序列化.
20.什么是Iterator(叠代器)?
Iterator接口提供了许多可以叠代集合办法.每个java集合(Collection)都具有一种返回Iterator实例iterator办法.叠代器在叠代过程中可以移除底层集合中元素.
21.Iterator和ListIterator之间不同?
它们之间不同如下:
∙Iterator可以遍历Set和List集合,而ListIterator只能用来遍历List.
∙Iterator只能正向遍历集合,而ListIterator可以双向遍历List.
∙ListIterator实现了Iterator接口并提供了额外功能,例如添加元素,替代元素,获得上一种或上一种元素索引,等等.
22.fail-fast与fail-safe区别?
Iteratorfail_safe特性是对底层集合拷贝进行操作,因而对集合任何变化都不会有影响.java.util包下所有集合类是fail-fast,但java.util.concurrent包下集合类是fail-safe.fail-fast叠代器会抛出ConcurrentModificationException,而fail-safe叠代器不会抛出这种异常.
23.Java中HashMap是怎么工作?
Java中HashMap是用来存储键值对。
HashMap 需要一种hash函数,它使用 hashCode 和 equals办法,来进行collection中元素保存和查找。
调用put办法时,HashMap 会计算键(key)hash值,然后将键值对存到collection恰当索引下。
如果键已经存在,那么相应值会更新。
HashMap 重要特性重要有它容量,装载因子(loadfactor)和容量扩充(thresholdresizing)。
24.hashCode()和equals()办法重要性何在?
Java中 HashMap 使用 hashCode 和 equals 办法来拟定键值对索引。
依照键去查询相应值时,同样会用到这两个办法。
如果这两个办法没有正的确现,两个不同键也许会产生相似hash值,因而会被collection以为是相似。
并且,这两个办法在检测重复时也会用到。
因而,这两个办法都要正的确现,对 HashMap 对的性和效率都至关重要。
25.HashMap与HashTable之间有哪些不同?
HashMap、HashTable这两个类都实现了Map接口,因而有些非常相似特性,但她们在如下特性中又有所不同:
∙HashMapkey与value都容许null值存在,而HashTable则既不容许key为null,也不容许value为null。
∙HashTable是线程同步,而HashMap则不是。
因而,在单线程环境下HashMap是首选,而HashTable更适合在多线程环境下使用。
∙HashMap提供了它键set集合,因而Java程序可以通过set进行迭代。
因而,HashMap是迅速失败。
另一方面,HashTable提供了它键枚举。
∙HashTable类被当做遗留类(译者注:
Java遗留类阐明)
26.Array与ArrayList间有什么不同?
与ArrayList相比你什么时候会用Array?
Array与ArrayList类在如下特性中有所区别:
∙Arrays可以包括基本数据类型或者对象,而ArrayList只能包括对象。
∙Arrays有固定长度,而ArrayList长度则是动态。
∙ArrayList类提供了更多办法和特性,例如addAll,removeAll,iterator,等等
∙对于一种基本数据类型list,集合框架使用了自动装箱去减少编码工作。
但针对固定长度基本数据类型,这种办法会使得它们变得更慢。
27.ArrayList与LinkedList间有什么不同?
ArrayList、LinkedList这两个类都实现了List接口,但她们如下特性中又有所不同:
∙ArrayList是基于索引数据构造,底层由Array支持实现。
它提供了以时间复杂度为O
(1)性能随机访问它元素,另一方面,LinkedList以元素列表方式来存储它数据,每一种元素与它前一种和后一种元素都是相连。
对元素查询操作时间复杂度为O(n).
∙对元素插入、添加、移除操作,与ArrayList相比,LinkedList更快,由于,当一种元素被添加到集合内部任意位置时,LinkedList不需要重新调节数组大小或者更新索引。
∙LinkedList比ArrayList消耗更多内存,由于LinkedList中每一种节点都存储了两个引用,一种是它前一种元素,一种是它后一种元素
也可以查看咱们文章ArrayListvs.LinkedList
28.Comparable和Comparator接口分别是什么?
列出它们区别。
Java提供 Comparable 接口,其中只包括一种办法,就是 compareTo。
这个办法会比较两个对象,从而得出它们顺序关系。
详细来说,它会返回一种负整数,零,或一种正整数,分别表达传入对象不大于,等于或不不大于已有对象。
Java提供 Comparator 接口,包括两个办法,compare 和 equals 。
compare办法比较两个参数,得出它们顺序关系。
它会返回一种负整数,零,或一种正整数,分别表达第一种参数不大于,等于或不不大于已有对象。
equals办法有1个参数,它用来拟定参数对象与否等于这个camparator。
这个办法仅在要比较对象也是一种comparator,同步它序关系与这个comparator相似时,才会返回true。
29.JavaPriorityQueue是什么?
PriorityQueue是一种基于优先级堆无界队列,它元素都以她们自然顺序有序排列。
在它创立时候,咱们可以可以提供一种比较器(Comparator)来负责PriorityQueue中元素排序。
PriorityQueue不容许null元素,不容许不提供自然排序对象,也不容许没有任何关联Comparator对象。
最后,PriorityQueue不是线程安全,在执行入队和出队操作它需要O(log(n))时间复杂度。
30.关于Big-O符号你理解些什么?
你能针对不同数据构造举些例子吗?
Big-O符号简朴描述了,在一种数据构造中随着元素不断增长,在最坏状况下,一种算法扩展或者执行能有多好。
Big-O符号还可以用来描述其她行为,例如内存消耗。
由于collection集合下类事实上都是数据构造,咱们通惯用Big-O符号来选取基于时间、内存、性能前提下最佳实现去使用。
Big-O符号能就大量数据性能给出一种较好批示。
31.如何权衡有序数组和无序数组?
有序数组最核心优势在于搜索时间复杂度为O(logn),而无序数组时间复杂度是O(n)。
有序数组劣势就在于插入操作时间复杂度为O(n),由于较高值元素需要挪动位置腾出空间给新元素。
与之不同是,无序数组插入操作时间复杂度为O
(1)。
32.有哪些关于Java集合框架最佳实践?
∙基于应用需求来选取使用对的类型集合,这对性能来说是非常重要。
例如,如果元素大小是固定,并且懂得优先级,咱们将会使用一种 Array,而不是 ArrayList。
∙某些集合类容许咱们指定她们初始容量。
因而,如果咱们懂得存储数据大概数值,就可以避免重散列或者大小调节。
∙总是使用泛型来保证类型安全,可靠性和健壮性。
同步,使用泛型还可以避免运营时 ClassCastException。
∙在Map中使用JavaDevelopmentKit(JDK)提供不可变类作为一种key,这样可以避免 hashCode 实现和咱们自定义类equals办法。
∙应当依照接口而不是实现来编程。
∙返回零长度集合或者数组,而不是返回一种null,这样可以防止底层集合是空。
33.Enumeration和Iterator接口有什么不同?
Enumeration 跟Iterator相比较快两倍,并且占用更少内存。
但是,Iterator 相对于Enumeration更安全,由于其她线程不能修改当前迭代器遍历集合对象。
同步,Iterators容许调用者从底层集合中移除元素,这些Enumerations都没法完毕。
34.HashSet和TreeSet有什么不同?
HashSet 是用一种hash表来实现,因而,它元素是无序。
添加,删除和HashSet涉及办法持续时间复杂度是O
(1)。
另一种方面,TreeSet是用一种树形构造实现,因而,它是有序。
添加,删除和TreeSet包括办法持续时间复杂度是 O(logn)。
垃圾回收器
35.Java中垃圾回收目是什么,它什么时候被使用?
垃圾回收用于辨认和丢弃程序不再需要对象,以便回收和复用资源.
36.System.gc()和Runtime.gc()办法用途?
这些办法用于提示JVM开始垃圾回收.然而开始垃圾回收时机是由JVM决定.
37.finalize()什么时候被调用?
它目是什么?
finallize办法是在释放该对象内存前由gc(垃圾回收器)调用.普通建议在这个办法中释放该对象持有资源.
38.如果一种对象引用被设立为null,gc会及时释放该对象内存么?
不会,这个对象将会在下一次gc循环中被回收.
39.Java堆构造是什么?
堆中PermGen(全称是PermanentGeneration)空间是什么?
JVM有一种运营时数据区,即堆(heap).所有类实例和数组内存都是从堆中分派.它在JVM启动时被创立.对象所占用堆内存会被一种称为垃圾回收器自动内存管理系统收回.
堆内存中包括活和死对象.活对象可以被程序访问并且不会被垃圾回收.死对象是那些不会被程序访问,但还没有被垃圾回收器收回对象.这种对象会占用堆内存空间直到最后被垃圾回收器收回.
40.Serial垃圾回收器与Throughput垃圾回收器区别?
Throughput垃圾回收器使用并行版本新生代回收器,它用于中到大型数据集应用.另一方面,Serial回收器普通足以应对大多数小应用(在当代解决器上不会超过约100MB堆内存).
41.什么时候对象会被回收?
当当前程序无法访问到某个对象时,该对象将被回收.
42.垃圾回收发生在指定JVM区域?
垃圾回收在PermGen里发生。
如果PermGen满了或是到了瓶颈,就会触发完全回收。
如果仔细观测垃圾回收过程,会发现PermGen最后也被回收了.这就是为什么要设立合理PermGen大小以避免完全垃圾回收.可以看看这篇文章 Java8:
PermGentoMetaspace.
异常解决
43.Java中两种异常是什么?
它们之间区别?
Java有两种类型异常:
checked与unchecked(检查与未检查)异常.如果unchecked异常也许会在办法或构造函数执行时被抛出从而蔓延到办法或构造函数外部,它们也不需要要在办法或构造函数中声明throws子句.然而,checked异常必要通过办法或构造函数throws子句声明.关于java异常解决建议请参照这里Javaexceptionhandling.
44.Java中异常与错误区别?
Exception和Error都是Throwable类子类. Exception用于顾客程序需要捕获异常条件. Error定义了顾客程序不可预见异常
45.throw与throws区别?
核心字throw用于在程序中显式地抛出一种异常.相反,throws子句用于指出在该办法中没有解决异常.每个办法必要显式指明哪些异常没有解决,以便该办法调用者可以防止也许发生异常.最后,各种异惯用逗号分隔.
45.异常解决中finally语句块重要性?
不论程序与否发生了异常,finally语句块都会被执行.甚至当没有catch声明但抛出了一种异常时,finally语句块也会被执行.最后要说一点:
finally语句块通惯用于释放资源,如I/O缓冲区,数据库连接等等.
46.异常被解决后异常对象会发生什么?
异常对象会在下次gc执行时被回收.
47.如何区别finally语句块与finalize()办法?
不论与否抛出异常finally语句块都会被执行,它通惯用于释放程序持有资源.finalize是Object类中一种protected办法,当一种对象被gc回收前它会被jvm调用.
JavaApplets
48.什么是Applet?
一种JavaApplet可以包括在HTML页面中并且可以在启用Java客户端浏览器中运营。
Applets可以用来创立动态和交互式web应用程序。
49.Applet生命周期阐明
一种Applet也许会经历如下几种状态:
∙Init:
每次加载时候都进行初始化
∙Start:
开始执行一种applet
∙Stop:
停止执行一种applet
∙Destroy:
卸载applet之前执行最后清理
50.当applet加载时候会发生什么?
一方面,会创立一种applet控制类实例。
然后,applet初始化,最后applet开始运营。
51.Applet和Java应用程序有什么不同?
Applets需要一种支持Java浏览器,但是Java应用程序可以被单独执行。
但是,她们都需要一种Java虚拟机,JVM。
尚有,一种Java应用程序需要一种main办法与特定签名,来保证启动.Javaapplets并不需要这样某些东西。
最后,JavaApplet普通使用严格安全方略,而Java应用程序普通使用较宽松安全方略。
52. 什么是强加给JavaApplet限制?
这重要是由于安全因素,如下限制强加在Java小程序:
∙Applet无法加载库或定义本地办法。
∙Applet普通无法读取或执行主机文献。
∙Applet无法读取某些系统属性。
∙除非连接来自主机否则不能进行网络连接。
∙Applet程序不能启动主机上执行它任何程序。
53.什么是不可信Applet?
不受信任Applet是那些JavaApplet不能访问或执行本地系统文献程序。
默认状况下,所有下载Applet被以为是不可信。
54.通过文献系统加载小程序在加载了互联网和Applet之间区别是什么?
关于其中一种applet被加载在互联网状况下,applet是由applet类加载器加载并须受该applet安全管理器执行限制。
关于其中一种applet是从客户端本地磁盘加载状况下,applet是由文献系统加载器加载。
通过文献系统加载applet容许读取文献,写入文献并加载在客户端上。
尚有,通过文献系统加载applet容许执行,最后,通过文献系统加载applet不论与否通过字节码验证都可加载。
55.什么是applet类加载器,它提供了什么?
当在互联网上加载applet,该applet是由applet类加载器加载。
类加载器强制执行Java命名空间层次构造。
此外