您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > 115个Java面试题及回答
115个Java面试题及回答在本教程中,我们将讨论在Java面试中,用人单位用来测试应聘者Java以及面向对象的能力的面试题目.以下章节我们将按照以下结构讨论面试问题,面向对象编程及其特性,Java及其特性的一般问题,集合,垃圾回收,异常处理,Javaapplets,Swing,JDBC,RMI,Servlet和JSP.来,我们一起出发吧。。目录ObjectOrientedProgramming(OOP)GeneralQuestionsaboutJavaJavaThreadsJavaCollectionsGarbageCollectorsExceptionHandlingJavaAppletsSwingJDBCRemoteMethodInvocation(RMI)ServletsJSP面向对象编程(OOP)Java是支持并发,基于类的以及面向对象的一种计算机编程语言.以下列举了面向对象编程的优势:模块化编程,使维护和修改更加容易代码重用提高代码的可靠性以及灵活性提高代码可读性面向对象编程有其非常明显的特性,比如说封装,继承,多态和抽象.下面我们来分析一下每种特性.封装(Encapsulation)封装,提供的对象隐藏内部特性和行为的一种能力,每个对象提供了一些方法,其他的对象可以访问并改变其内部数据。在Java中,提供了三种访问修饰符:公有的,私有的以及保护的。每个修饰符都设定了不同的访问权限,这个权限设置不会因为包的不同而有差异。下面是使用封装的一些优点:通过隐藏属性来保护对象的内部信息因为可以独立的修改或者扩展对象的行为,从而提高代码的可用性以及维护性隔离,通过阻止对象使用不希望的互动方式来交互,以此来提高模块化程度。你可以通过链接访问我们的教程查看关于封装更多的细节和实例.多态(Polymorphism)多态就是针对不同的基础数据类型呈现相同接口的一种能力,多态类型就是其操作可以适用于不同类型值的一种类型。继承(Inheritance)继承提供了一个对象从基类获取字段和方法的一种能力.继承提供了代码的重用性,并且在不更改现有类的情况下,对现有类增加额外的功能。抽象(Abstraction)抽象是从具体的实例中分离想法的过程,根据他们各自的功能而非具体的实现来开发类.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个基本数据类型如下:byteshortintlongfloatdoublebooleancharAutoboxing是指在基本数据类型和对应的包装(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个线程时一个非常简单的避免死锁的方法是为所有的锁排序,并强制每个线程也按那种方式排序.这样,如果所有线程以相同的顺序锁定和解锁互斥资源就不会发生死锁了.JavaCollections18.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的区别?Iterator的fail_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的适当索引下。
本文标题:115个Java面试题及回答
链接地址:https://www.777doc.com/doc-6448084 .html