专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 25道Java经典面试题(附答案)

25道Java经典面试题(附答案)

更新时间:2020-10-10 17:28:44 来源:动力节点 浏览3539次

在移动互联网发展如此迅速的今天,IT行业的java程序员工程师成了发展前景最好、最热门的职业之一,正是因为这样的情况使得程序员们的就业门槛随之提高。Java语言是应用最广泛的计算机语言,java程序员在找工作的时候要做的必要准备就是面试题,这里整理了java经典面试题,都是在大公司面试中出现几率最高的面试题目,有面试需要的朋友们赶快来学习吧。

image.png

1、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

答:Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。

Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变为可能,因为它知道底层硬件平台的指令长度和其他特性。

2、JDK和JRE的区别是什么?

答:Java运行时环境(JRE)是将要执行Java程序的Java虚拟机。它同时也包含了执行applet需要的浏览器插件。Java开发工具包(JDK)是完整的Java软件开发包,包含了JRE,编译器和其他的工具(比如:JavaDoc,Java调试器),可以让开发者开发、编译、执行Java应用程序。

3、“static”关键字是什么意思?

答:“static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。

4、Java中是否可以覆盖(override)一个private或者是static的方法?

Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。

5、是否可以在static环境中访问非static变量?

答:static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

6、接口和抽象类的区别是什么?

答:Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:

(1)接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法;

(2)类可以实现很多个接口,但是只能继承一个抽象类;

(3)类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的;

(4)抽象类可以在不提供接口方法实现的情况下实现接口;

(5)Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量;

(6)Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public;

(7)接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

7、创建线程有几种不同的方式?说出你喜欢的其中一种的优点

答:有三种方式可以用来创建线程:继承Thread类;实现Runnable接口;应用程序可以使用Executor框架来创建线程池。

实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。同时,线程池也是非常高效的,很容易实现和使用。

8、概括的解释下线程的几种可用状态。

答:线程在执行过程中,可以处于下面几种状态:

就绪(Runnable):线程准备运行,不一定立马就能开始执行。

运行中(Running):进程正在执行线程的代码。

等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。

睡眠中(Sleeping):线程被强制睡眠。I/O阻塞(Blocked on I/O):等待I/O操作完成。

同步阻塞(Blocked on Synchronization):等待获取锁。

死亡(Dead):线程完成了执行。

9、Java中的两种异常类型是什么?他们有什么区别?

答:Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常。不受检查的异常不需要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方法或者是构造函数的外面。相反,受检查的异常必须要用throws语句在方法或者是构造函数上声明。

10、Java中Exception和Error有什么区别?

答:Exception和Error都是Throwable的子类。Exception用于用户程序可以捕获的异常情况。Error定义了不期望被用户程序捕获的异常。

11、throw和throws有什么区别?

答:throw关键字用来在程序中明确的抛出异常,相反,throws语句用来表明方法不能处理的异常。每一个方法都必须要指定哪些异常不能处理,所以方法的调用者才能够确保处理可能发生的异常,多个异常是用逗号分隔的。

image.png

12、数据库连接池是什么意思?

答:像打开关闭数据库连接这种和数据库的交互可能是很费时的,尤其是当客户端数量增加的时候,会消耗大量的资源,成本是非常高的。可以在应用服务器启动的时候建立很多个数据库连接并维护在一个池中。连接请求由池中的连接提供。在连接使用完毕以后,把连接归还到池中,以用于满足将来更多的请求。

13、什么是Web应用程序?

答:Web应用程序是对Web或者是应用服务器的动态扩展。有两种类型的Web应用:面向表现的和面向服务的。面向表现的Web应用程序会产生包含了很多种标记语言和动态内容的交互的web页面作为对请求的响应。而面向服务的Web应用实现了Web服务的端点(endpoint)。一般来说,一个Web应用可以看成是一组安装在服务器URL名称空间的特定子集下面的Servlet的集合。

14、什么是cookie?session和cookie有什么区别?

答:cookie是Web服务器发送给浏览器的一块信息。浏览器会在本地文件中给每一个Web服务器存储cookie。以后浏览器在给特定的Web服务器发请求的时候,同时会发送所有为该服务器存储的cookie。下面列出了session和cookie的区别:

无论客户端浏览器做怎么样的设置,session都应该能正常工作。客户端可以选择禁用cookie,但是,session仍然是能够工作的,因为客户端无法禁用服务端的session。

在存储的数据量方面session和cookies也是不一样的。session能够存储任意的Java对象,cookie只能存储String类型的对象。

15、final, finally, finalize的区别?

答:final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。

finally是异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

16、什么是JSP页面?

答:JSP页面是一种包含了静态数据和JSP元素两种类型的文本的文本文档。静态数据可以用任何基于文本的格式来表示,比如:HTML或者XML。JSP是一种混合了静态内容和动态产生的内容的技术。这里看下JSP的例子。

17、JSP请求是如何被处理的?

答:浏览器首先要请求一个以.jsp扩展名结尾的页面,发起JSP请求,然后,Web服务器读取这个请求,使用JSP编译器把JSP页面转化成一个Servlet类。需要注意的是,只有当第一次请求页面或者是JSP文件发生改变的时候JSP文件才会被编译,然后服务器调用servlet类,处理浏览器的请求。一旦请求执行结束,servlet会把响应发送给客户端。这里看下如何在JSP中获取请求参数。

18、JSP有什么优点?

答:下面列出了使用JSP的优点:

(1)JSP页面是被动态编译成Servlet的,因此,开发者可以很容易的更新展现代码;

(2)JSP页面可以被预编译;

(3)JSP页面可以很容易的和静态模板结合,包括:HTML或者XML,也可以很容易的和产生动态内容的代码结合起来;

(4)开发者可以提供让页面设计者以类XML格式来访问的自定义的JSP标签库;

(5)开发者可以在组件层做逻辑上的改变,而不需要编辑单独使用了应用层逻辑的页面。

19、什么时候使用Object类?

答:对于Object类的使用可以分为两个阶段:JDK1.5之前以及JDK1.5之后。Object之所以会被大量的进行参数的接收处理,很大一部分原因在于:你的程序里面需要接收的类型很多,并不固定。现在的开发理念之中强调的问题不再是这一点了,而是如何避免向下转型(如果避无可避,那么就用),因为从JDK1.5之后引入了泛型机制,现在的设计思想是用泛型来避免向下转型的操作(ClassCastException),认真读了API文档就会发现可以接收Object类型的方法是越来越少了,所以以后的开发中应该尽量以回避Object接收的项目为主。

20、什么情况下使用虚拟内存,好处是什么?

答:从Java8开始取消了永久代,使用元空间来进行操作,也就是说Java可以直接使用操作系统的内存进行处理,这个时候就有可能导致每一个线程分配的真实的主机内存空间越大,如果内存不足,操作系统会进行虚拟内存的控制,对于虚拟内存不需要做特别多的处理。

当线程访问量追加,JVM就有可能不断的进行内存申请以及内存回收。

21、Hibernate是不是只能与Struts2组合才好?

答:Hibernate实现的是一个数据层的开发框架,数据层是不会与MVC层产生任何直接联系,必须通过控制层与业务层来进行操作的处理后才可以使用。

最初的时候(2005)开始流行这个框架开发,使用最多的就是Struts1.X、Hibernate、Spring,而后就形成SSH的开发框架。现在的环境出现了改变,因为MyBatis出现之后会有人觉得Hibernate操作过于频繁,而MyBatis的开发更加简单。正因为如此,对于整体新项目设计而言就不会再过多的去考虑Hibernate了,基本上都是使用MyBatis开发框架。同时,在这个时期之后SpringMVC开始流行了,因为Struts毕竟需要与Spring整合,有人认为麻烦,现在对于开发就可能有如下几种结构:

Struts 2.X+Hibernate+Spring;

Struts 2.X+MyBatis+Spring;

SpringMVC+Hibernate;

SpringMVC+MyBatis。

22、Shiro中的Session与HttpSession的关系是什么?

答:如果说你现在使用的不是WEB程序,而是一个Java程序,那么Shiro中的认证与授权依然有效。可以得出一个结论:Shiro有一套自己维护的“Session”机制(不等同于HttpSession),如果要在WEB中应用,实际上就表示该Shiro Session要结合HttpSession一起使用,也就是说在Shiro Session中保存的内容在WEB容器里面实质上是保存在了HttpSession里面。

理解为:HttpSession中存在一个指定的Shiro属性,Shiro在设计的时候考虑到了用户的使用习惯,所以对于一些用户的身份信息,会将这些身份信息保存在Session里面,用户也可以直接利用Session属性取得相关的身份信息。

23、重载和重写的区别有什么?

答:(1)重写必须继承,重载不用;

(2)重载表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同(即参数个数或类型不同);

(3)重写表示子类中的方法与父类中的某个方法的名称和参数完全相同啦,通过子类实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这是面向对象编程的多态性的一种表现;

(4)重写的方法修饰符大于等于父类的方法,即访问权限只能比父类的更大,不能更小,而重载和修饰符无关。

24、Comparator与Comparable有什么区别?

答:(1)Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法;

(2)Comparator位于包java.util下,而Comparable位于包 java.lang下;

(3)Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口) 自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序, 这里的自然顺序就是实现Comparable接口设定的排序方式;

(4)而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。

(5)可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。

25、说出数据连接池的工作机制是什么?

答:容器或相关的应用程序在其池中实例化多个边接,当应用程序在使用时,容器直接将池中的连接取出应用程序直接使用,同时当应用程序使用完后,容器还可以将连接收回。从而提高系统的效率。

以上就是今天为大家整理的java经典面试题,一共有25道题目,都是属于java基础知识范畴内的,更是java程序员们必会的知识点,程序员面试的第一道门槛便是做java面试题,如果面试题有一半是错的,那可能连面试官的面都见不上,小编呕心沥血的拨了各大互联网公司java程序员面试题,才有了这篇25道经典java面试题的问世,所以希望大家可以根据这篇文章内的25道经典面试题查漏补缺,遇到不会的及时通过java视频教程或者java专业书籍学会搞懂,顺利通过java程序员的面试。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>