在本教程中,我们将讨论在Java面试中,用人单位用来测试应聘者Java以及面向对象的能力的面试题目.以下章节我们将按照以下结构讨论面试问题,面向对象编程及其特性,Java及其特性的一般问题,集合,垃圾回收,异常处理,Java applets,Swing,JDBC,RMI, Servlet 和 JSP. 来,我们一起出发吧。。 目录
|
面向对象编程(OOP)Java是支持并发,基于类的以及面向对象的一种计算机编程语言. 以下列举了面向对象编程的优势:
面向对象编程有其非常明显的特性,比如说封装,继承,多态和抽象. 下面我们来分析一下每种特性. 封装(Encapsulation) 封装,提供的对象隐藏内部特性和行为的一种能力,每个对象提供了一些方法,其他的对象可以访问并改变其内部数据。在Java中,提供了三种访问修饰符: 公有的,私有的以及保护的。每个修饰符都设定了不同的访问权限,这个权限设置不会因为包的不同而有差异。 下面是使用封装的一些优点:
你可以通过链接访问我们的教程查看关于封装更多的细节和实例. |
多态(Polymorphism) 多态就是针对不同的基础数据类型呈现相同接口的一种能力,多态类型就是其操作可以适用于不同类型值的一种类型。 继承(Inheritance) 继承提供了一个对象从基类获取字段和方法的一种能力.继承提供了代码的重用性,并且在不更改现有类的情况下,对现有类增加额外的功能。 抽象(Abstraction) 抽象是从具体的实例中分离想法的过程,根据他们各自的功能而非具体的实现来开发类. 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 (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,因为 override 的机制是运行时(runtime)的动态绑定,而 static 方法是在编译时静态绑定的。static 方法并不与任何类的具体实例有关,因此无法应用继承的概念。 4. 在静态方法里可以访问非静态变量吗? Java 中的 static 变量归相应的类所有,它的值对于类的所有实例都是相同的。static 变量是在 JVM 加载类的时候初始化的。如果代码试图访问非静态的变量,而且不是通过类的实例去访问,编译器会报错,因为这些非静态变量还没有被创建呢,并且它们没有与实例相关联。 |
5. Java 支持哪些数据类型?什么是 Autoboxing 和 Unboxing?
Autoboxing 是指在基本数据类型和对应的包装(wrapper)类之间Java 编译器所做的自动转换。例如,编译器将 int 转换为 Integer,将 double 转换为 Double ,等等。逆向的转换称为 unboxing。 6. 在Java中什么是方法的 Override(覆盖) 和 Overload(重载)? |
7.Java中构造函数、构造函数重载的概念和拷贝构造函数 当类的对象被创建的时候,调用它的构造函数。每个类都有一个构造函数。如果程序员没有为类编写构造函数,Java编译器自动为类创建一个缺省的构造函数。 构造函数重载和Java中函数重载类似,可以为同一个类创建不同的构造函数,每个构造函数必须拥有唯一的参数列表。 Java与C++不同,它不支持拷贝构造函数,但是区别仅仅是,如果你没有编写类的拷贝构造函数,Java不会自动创建它。 8.Java支持多继承吗? Java不支持多继承,每个类只允许继承一个类,但是可以实现多个接口。 |
9.接口和抽象类有什么不同? Java同时提供和支持抽象类和接口,它们的实现有一些共同的特点,也有如下不同:
也可以查阅 Abstract class and Interface differences for JDK 8 。 10.传引用和传值 当对象通过传值调用时,传递的是这个对象的一个拷贝。因此,即使函数修改这个对象,也不会影响原对象的值。 当对象通过传引用调用时,对象本身没有被传递,而传递的是对象的一个引用。因此,外部函数对这个对象的修改,也会反映到任何出现这个对象的地方。 |
Java 线程11. 进程与线程的区别 ? 12. 说下创建线程的不同方式. 你倾向于哪种方式并说明原因 ?
首选方式是实现Runnable接口, 因为它不需要继承Thread类. 当你的程序设计需要多继承时, 使用接口会有所帮助. 另外, 线程池效率是很高的, 并且实施起来也很简单. |
13. 解释下可用的线程状态.
在执行期间, 线程会处于以下状态中的一种:
Runnable: 线程已准备就绪, 但没有立即运行.
Running: 处理器正在执行的线程代码.
Waiting: 处于阻塞状态的线程, 等待外部某种处理的结束.
Sleeping: 被强制休眠的线程.
Blocked on I/O: 等待I/O操作的完成.
Blocked on Synchronization: 等待取得线程锁.
Dead: 线程已经执行结束.
14. 同步方法与同步块的区别 ?
在Java程序中, 每个对象都拥有一个锁. 线程可以通过使用synchronized关键字来获取一个对象上的锁. synchronized关键字可以用于方法级别(粗粒度锁)或代码块级别(细粒度锁).
15. 在监视器中的线程同步是怎样发生的? 你可以使用哪些级别的同步 ? JVM使用结合了监视器的锁. 监视器是一个守护者, 它看管一个同步代码的序列, 并且确保在一个时刻只能有一个线程执行同步代码片段. 每个监视器关联着一个对象引用. 只能得到锁的线程才可以执行同步代码. 16. 什么是死锁 ? 当两个进程相互等待对方执行完毕时, 其结果是它们会永远等待下去. 17. 怎样确保N个线程访问N个资源时不会发生死锁 ? 使用N个线程时一个非常简单的避免死锁的方法是为所有的锁排序, 并强制每个线程也按那种方式排序. 这样, 如果所有线程以相同的顺序锁定和解锁互斥资源就不会发生死锁了. |
Java Collections18. Java Collections框架的基本接口 ?
19. 为什么Collection没有继承Cloneable和Serializable接口 ? Collection接口描述的是由元素组成的对象组. Collection的每一个具体实现可以选择自己的方式来管理元素. 一些集合允许存在重复键, 另一些则不允许. 当处理实际实现时复制和序列化的语义和效果才会起作用. 因此, 集合类的具体实现应该决定它们将怎样被复制和序列化. |
20. 什么是Iterator(叠代器) ? Iterator接口提供了许多能够叠代集合的方法.每个java集合(Collection)都含有一个返回Iterator实例的iterator方法. 叠代器在叠代过程中能够移除底层集合中的元素. 21. Iterator 和ListIterator之间的不同 ?
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 是怎么工作的? 24. hashCode() 和 equals() 方法重要性何在 ? |
25.HashMap与HashTable之间有哪些不同? HashMap、HashTable这两个类都实现了Map接口,因此有些非常相似的特征,但他们在以下特性中又有所不同:
26.Array与ArrayList间有什么不同?与ArrayList相比你什么时候会用Array? Array与ArrayList类在以下特性中有所区别:
27.ArrayList与LinkedList间有什么不同? ArrayList、LinkedList这两个类都实现了List接口,但他们以下特性中又有所不同:
也可以查看我们的文章ArrayList vs. LinkedList |
28. Comparable 和 Comparator 接口分别是什么 ? 列出它们的区别。 Java 提供的 Comparator 接口,包含两个方法,compare 和 equals 。compare 方法比较两个参数,得出它们的顺序关系。它会返回一个负整数,零,或一个正整数,分别表示第一个参数小于,等于或大于已有的对象。equals 方法有1个参数,它用来确定参数对象是否等于这个 camparator。这个方法仅在要比较的对象也是一个 comparator,同时它的序关系与这个 comparator 相同时,才会返回 true。 |
29.Java Priority Queue是什么? 30. 关于Big-O符号你了解些什么?你能针对不同数据结构举些例子吗? |
31. 如何权衡有序数组和无序数组 ? 32. 有哪些关于 Java 集合框架的最佳实践?
|
|
33. Enumeration 和 Iterator 接口有什么不同 ? 34. HashSet 和TreeSet 有什么不同? 另一个方面,TreeSet 是用一个树形结构实现的,因此,它是有序的。添加,删除和 TreeSet 包含的方法的持续时间复杂度是 O(logn)。 |
35. Java中垃圾回收的目的是什么, 它什么时候被使用 ?
垃圾回收用于识别和丢弃程序不再需要的对象, 以便回收和复用资源.
36. System.gc() 和Runtime.gc()方法用途?
这些方法用于提醒JVM开始垃圾回收. 然而开始垃圾回收的时机是由JVM决定的.
37. finalize()什么时候被调用 ? 它的目的是什么 ?
finallize方法是在释放该对象内存前由gc(垃圾回收器)调用. 通常建议在这个方法中释放该对象持有的资源.
38.如果一个对象的引用被设置为null, gc会立即释放该对象的内存么?
不会, 这个对象将会在下一次gc循环中被回收.
39. Java堆的结构是什么 ? 堆中的Perm Gen(全称是Permanent Generation)空间是什么 ? JVM有一个运行时数据区,即堆(heap).所有的类实例和数组的内存都是从堆中分配的. 它在JVM启动时被创建. 对象所占用的堆内存会被一个称为垃圾回收器的自动内存管理系统收回. 堆内存中包含活的和死的对象. 活的对象可以被程序访问并且不会被垃圾回收. 死的对象是那些不会被程序访问的, 但还没有被垃圾回收器收回的对象. 这种对象会占用堆内存空间直到最终被垃圾回收器收回. 40. Serial 垃圾回收器与 Throughput 垃圾回收器区别 ? Throughput垃圾回收器使用并行版本的新生代回收器, 它用于中到大型数据集的应用. 另一方面, Serial回收器通常足以应对大多数的小应用(在现代处理器上不会超过约100MB的堆内存). |
41. 什么时候对象会被回收 ? 42. 垃圾回收发生在指定的JVM区域 ? |
异常处理43. Java中的两种异常是什么?它们之间的区别? 44. Java中异常与错误的区别? Exception和Error都是Throwable类的子类. Exception用于用户程序需要捕获的异常条件. Error定义了用户程序不可预见的异常 |
45. throw与throws的区别 ? 45. 异常处理中finally语句块的重要性? 不管程序是否发生了异常, finally语句块都会被执行. 甚至当没有catch声明但抛出了一个异常时, finally语句块也会被执行. 最后要说一点: finally语句块通常用于释放资源, 如I/O缓冲区, 数据库连接等等. 46. 异常被处理后异常对象会发生什么? 47. 怎样区分finally语句块与finalize()方法? |
Java Applets48. 什么是 Applet ? 49. Applet 生命周期的说明
50. 当 applet 加载的时候会发生什么? |
51. Applet和Java应用程序有什么不同? 还有, 一个Java应用程序需要一个main方法与特定的签名,来确保启动. Java applets并不需要这样一些东西。 最后, Java Applet通常使用严格的安全策略,而Java应用程序通常使用较宽松的安全策略。 52. 什么是强加给Java Applet限制?
|
53. 什么是不可信的Applet ? 54. 通过文件系统加载的小程序在加载了互联网和Applet之间的区别是什么 ? 关于其中一个applet是从客户端的本地磁盘加载的情况下,applet是由文件系统加载器加载的。 通过文件系统加载的applet允许读取文件,写入文件并加载在客户端上。还有,通过文件系统加载applet允许执行,最后,通过文件系统加载的applet不管是否通过字节码验证都可加载。 |
55. 什么是applet类加载器,它提供了什么? |
|
56. 什么是applet安全管理,它提供什么? Swing57. Choice和List之间的区别是什么? 58. 什么是布局管理器? 59. Scrollbar和JScrollPane 的区别是什么? 60. 哪些Swing方法是线程安全? |
61. 说出3个支持绘图的子类。
Canvas,Frame,Panel, 和Applet类都支持绘图。
62. 什么是裁剪?
裁剪是指在有限的区域和图形类进行绘图操作。
63. MenuItem和CheckboxMenuItem的区别是什么?
CheckboxMenuItem类继承了MenuItem类,并支持选中或者取消菜单选项。
64. BorderLayout的元素是怎样组织的?
BorderLayout的元素都是在有序地分布在边缘部分(东,南,西,北)和容器的中心。
65. GridBagLayout的元素是怎样组织的?
GridBagLayout的元素根据网格组织的。元素具有不同的尺寸,并且可以占据一行或列的网格。因此,行和列可以有不同的尺寸。
66. Window和Frame有什么区别?
Frame类是继承Window类,并定义了一些主要的带菜单栏的应用程序窗口。
67. 裁剪和重画之间的关系?
当窗口被AWT绘图线程重画,它设置了裁剪区域到窗口中请求重画的区域。
68. 事件监听器接口和事件适配器类之间是什么关系? 69. 一个GUI组件怎么处理自己的事件? 70. Java布局管理器提供超过传统的窗口系统的什么样的优势? 71. Java为所有Swing组件使用的设计模式是什么? |
JDBC72. 什么是 JDBC ? 73. 解释JDBC中驱动的作用。 74.Class.forName 方法的目的是什么? |
75.与Statement相比PreparedStatement的优点? PreparedStatement是预编译的,因此它有更好的性能。另外,PreparedStatement可以被不同输入值的查询重用。 76. CallableStatement的用途 ? 指出用于创建CallableStatement的方法. CallableStatement用于执行存储过程。存储过程由数据库保存并提供。存储过程可以根据用户的输入返回结果。强烈建议使用存储过程,因为它提供了安全性和模块化。准备CallableStatement的方法如下: CallableStament.prepareCall(); 77. 连接池是什么 ? 打开和关闭数据库连接时与数据库的交互需要付出很高的代价. 特别是当数据库客户端增长时,这个代价是相当高的,并且消耗了很多资源。数据库连接池中的连接在应用服务器启动时被创建并在池中进行管理。一个连接请求由池中的数据库连接提供。当连接结束后,请求会被放回池中以供以后重用。 |
|
远程方法调用 (RMI)78. 什么是RMI ? 79. 什么是RMI的体系结构的基本原理? |
|
80. RMI的体系结构层是什么?
81. 在RMI中远程接口的作用是什么? |
82. java.rmi.Naming 类扮演的角色 ? java.rmi.Naming类提供了存储和获取已注册的远程对象. Naming类中的每个方法都需要一个URL格式的String作为参数的名称. 83. RMI中的绑定是什么意思 ? 绑定是关联或注册一个远程对象的名字的过程, 这个名字可以在以后用到, 用于查找与它绑定的远程对象. 远程对象可以通过Naming类中的bind或rebind方法与一个名字相关联. 84. Naming 类中的bind与rebind方法的区别 ? bind方法的绑定主要用于将特定的名字绑定到一个远程对象, 但rebind方法的绑定用于将特定的名字重新绑定到一个新的远程对象. 如果这个名字已经绑定过了, 使用rebind这个绑定会被替换. |
85. 运行RMI 程序的步骤? 为了使RMI程序正常运行需要以下步骤:
86.RMI中stub的角色 ? 远程对象的stub作为远程对象在本地程序中的表示或代理. 调用者调用本地stub的一个方法, 这个方法会在远程对象上执行.当一个stub的方法被调用时, 它经历了以下步骤:
|
87. 什么是DGC?它是如何工作的? 88. 在RMI中使用RMISecurityManager的目的是什么? 89. 解释编组和解组。 |
90. 解释序列化和反序列化。 Servlets91. 什么是Servlet? |
92. 解释一个Servlet的架构.
核心抽象概念肯定是所有servlet必须实现 javax.servlet.Servlet 接口。 每个 servlet 必须直接或者间接实现这个接口, 也可以继承于 javax.servlet.GenericServlet 或者javax.servlet.http.HTTPServlet。最后想提的是,每个 servlet 能够使用多线程服务多个请求。
93. 一个 Applet 和 一个 Servlet 区别是什么 ?
一个 Applet 是一个跑在客户机器的 网页浏览器 里面的 客户端java程序。相反,一个 servlet 是跑在网页服务器的服务的容器。一个 applet 能使用用户界面class, 而一个 servlet 不能够有一个用户界面。相反,一个servlet 等待客户端的 HTTP 请求并为每一个请求生成一个响应。
95.解释一个Servlet的生命周期. 对每一个客户端的请求,这个Servlet引擎加载servlet和调用它的init方法,以便在servlet初始化。然后, Servlet对象处理所有从客户端来的后续请求,通过为每个请求单独调用服务的方法。最后,该servlet调用服务器的destroy方法。 96 .doGet()和doPost()之间的区别是什么? doGet : GET方法附加请求的URL的名称 - 值对。因此,存在客户端的请求字符数量的限制。此外,该请求的参数值为可见,因此,如果有敏感信息不能采用这种方式。 |
97. web应用是什么 ? 98. 什么是服务端包含 (SSI) ? |
99. 什么是 Servlet 链? 100. 如何知道请求 servlet的客户端信息 ? |
101. Http response的结构是什么 ?
102. 什么是cookie?session和cookie之间的区别是什么?
|
103.浏览器和servlet通过什么协议通信 ? 104. 什么是HTTP通道 ? |
105. sendRedirect和 forward 方法的区别? 106. 什么是URL编码和解码 ? URL编码就是替换其中的空格和特殊字符, 变成相应的Hex码.解码就是反向操作。 |
JSP107. JSP页面是什么 ? 108. JSP请求是如何被处理的? |
109. JSP的优势所在?使用JSP技术有以下优势:
110. 什么是指令?在JSP中, 包括哪些不同类型的指令?指令是JSP引擎所处理的命令,当网页被编译成小程序时,指令用于去设置页面级别的命令,从外部文件插入数据,指定自定义的标签库。指令被包括在<%@ 和%>内。指令的类型分为:
|
111. 什么是JSP的actions?
112. 什么是Scriptlet? |
113. 什么是声明?
声明类似于Java中的变量声明。声明是为表达式或者scriptlets后续的使用而声明的变量。添加一个声明,你必须在你的声明中使用序列。
114. 什么是表达式?
JSP表达式是把一个脚本语言表达式的值插入进来,转换成字符串,进入数据流之后再通过web服务器返回给客户端。表达式的定义是在<% = 和 %>标签之间。
115. 什么是隐式对象?他们是什么?
JSP隐式对象是指JSP容器在每页中提供给开发人员的Java对象。开发人员可以直接调用他们,而不需要任何显示声明。JSP隐式对象也被称为预定义变量。以下对象都是在JSP页面中隐式存在的:
application
page
request
response
session
exception
out
config
pageContext