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