Java面试宝典

CoreJava 部分
1. 简述一下 java 基本数据类型及所占位数 , java 基本数据类型: 4 8
逻辑型: boolean false/true 1byte
文本型: char 2byte
整数型: byte(1byte) short(2byte) int(4byte) long(8byte)
浮点数型: float(4byte) double(8byte)
 
2. 说出 5 个的启动时异常:
RunTimeException-----------------------运行时异常
NullPointerException--------------------空指针异常
ArrayIndexOutOfBoundsException--数组越界异常
ArithmeticException---------------------算术运算异常
ClassCastException---------------------类型转换异常
NumberFormatException---------------数字格式异常
 
3. HashMap HashTable 的区别:
(1).HashMap 允许空键值对, HashTable 不允许
(2).HashMap 不是线程安全的, HashTable
(3).HashMap 直接实现 Map 接口, HashTable 继承 Dictionary
 
4. ArrayList Vector LinkedList 存储性能和特性:
它们都实现 List 接口
ArrayList Vector 都是基于数组实现的
LinkedList 基于双向循环链表(查找效率低,添加删除容易)
ArrayList 不是线程安全的而 Vector 是线程安全的,所以速度上 ArrayList 高于 Vector
 
5.Collection Collections 的区别:
Collection 是集合类的上级接口,继承与他的接口主要有 Set List.
Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
 
6.List Map Set 三个接口,存取元素时,各有什么特点?
List 以特定次序来持有元素,可有重复元素。
Set 无法拥有重复元素 , 内部排序。
Map 保存 key-value 值, value 可多值。
 
7. final, finally, finalize 的区别:
final 用于声明属性,方法和类,分 别表示属性不可变,方法不可覆盖,类不可继承。
finally 是异常处理语句结构的一部分,表 示总是执行。
finalize Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如:关闭文件等。
 
8. Overload Override 的区别。 Overload 的方法是否可以改变返回值的类型 ?
方法的重写 Overriding 和重载 Overloading Java 多态性的不同表现。
重写 Overriding 是父类与子类之间多态性的一种表现 , 方法名,参数列表, 返回值类型都得与父类的方法一致 .
重载 Overloading 是一个类中多态性的一种表现。重载的方法是可以改变返回值的类型。
 
9. 用一句话总结一下冒泡排序:
依次比较相邻的两个数,将小数放在前面,大数放在后面 .
 
10. 实现线程安全的两种方式:
(1).synchronized 方法:通过在方法声明中加入 synchronized 关键字来声明synchronized 方法。
(2).synchronized 块:通过 synchronized 关键字来声明 synchronized 块。
 
11 .说一下 “==” equals() 方法在字串变量操作中的不同 ?
  ”==” 比较的是两个字符串对象的地址,
  equals() 是比较的两个字符串的具体值。
 
12. sleep() wait() 有什么区别?
sleep 是线程类( Thread )的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep 不会释放对象锁。
wait Object 类的方法,对此对象调用 wait 方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify 方法(或 notifyAll )后本线程才进入对象锁定池准备获得对象锁进入运行状态。
 
13.& && 的区别 ?
& 位运算符 : 非短路运算符,它会把所有条件执行完毕之后,才会返回结果
&& 逻辑运算符( and ):短路运算符,遇到不符合条件,立即终止程序的执行
 
14. error exception 区别:
error: 表示恢复不是不可能的一种严重的问题 , 比如:内存溢出,不指望程序处理
exception 程序运行时的异常,如果程序设计合理从不会出现的情况
 
15. 请说出你所知道的线程同步的方法:
wait():使一个线程处于等待状态,并且释放所持有的对象的 lock;
sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉 InterruptedException 异常;
notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且不是按优先级;
notityAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。
 
16. 网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别 ?
(1).进程:子进程是父进程的复制品子进程获得父进程数据空间堆和栈的复制品
(2).线程:相对与进程而言,线程是一个更加接近与执行体的概念,它可以与同进程的其他线程共享数据,但拥有自己的栈空间,拥有独立的执行序列两者都可以提高程序的并发度,提高程序运行效率和响应时间线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源管理和保护 ; 而进程正相反同时,线程适合于在SMP 机器上运行,而进程则可以跨机器迁移 。
 
17. 什么是反射?
在运行过程中:
1. 对于任意一个类 , 可以知道这个类的属性和方法 .
2. 对于任意一个对象 , 可以调用这个对象的任意方法 .
对于这种动态获取的信息 , 以及动态调用对象方法的功能称为反射机制 .
java 反射机制提供的功能:
1. 运行时判断任意对象的所属类 ;
2. 运行时构造任意类的对象 ;
3. 运行时判断和调用对象的成员变量和方法 ;
4. 生成动态代理 .
 
18. 什么是回调函数?
某个程序 S(Student.main) 调用服务程序 A(Arrays) 中的某个方法 (sort), 服务程序A sort 方法在某个时候反过来调用 S 的某个方法 (compareTo), 这种情况下,compareTo 叫做 S 的回调方法。
例如: public class Student implements Comparable{
private int id;
private String name;
private int age;
private int score;
// 构造器
//getter / setter 方法
// 回调方法
public int compareTo(Object obj){
return
this.id - ((Student)obj).id;
}
}
Student s1 = new Student(1,"a",18,89);
Student s2 = new Student(2,"x",22,94);
Student s3 = new Student(3,"w",19,78);
Student [] arrs = {s1,s2,s3};
Arrays.sort(arrs);
 
19 .遍历文件夹下所有 .java 的文件 ?
public void listFiles(String path){
File dir = new File(path);
Files files [] = dir.listFiles(new FileFilter(){
public boolean accept(File f){
return f.getName().endWith(".java"); }
});
for(File file : files){
System.out.println(file.getName());
}
}
 
20. 线程的基本概念、线程的本状态以及状态之间的关系:
新建 (Born) : 新建的线程处于新建状态
就绪 (Ready) : 在创建线程后,它将处于就绪状态,等待 start() 方法被调用
运行 (Running) : 线程在开始执行时进入运行状态
睡眠 (Sleeping) : 线程的执行可通过使用 sleep() 方法来暂时中止。在睡眠后,线程将进入就绪状态
等待 (Waiting) : 如果调用了 wait() 方法,线程将处于等待状态。用于在两个或多个线程并发运行时。
挂起 (Suspended) : 在临时停止或中断线程的执行时,线程就处于挂起状态。
恢复 (Resume) : 在挂起的线程被恢复执行时,可以说它已被恢复。
阻塞 (Blocked) – 在线程等待一个事件时(例如输入 / 输出操作),就称其处于阻塞状态。
死亡 (Dead) – run() 方法已完成执行或其 stop() 方法被调用之后,线程就处于死亡状态。
串行化的注意事项以及如何实现串行化答:如果有循环引用是不可以串行化的。对象输出流的 WriteObject 方法和 对象输入流的 ReadObect 方法
 
21. 描述一下 JVM 加载 class 文件的原理机制 ?
JVM 中类的装载是由 ClassLoader 和它的子类来实现的 ,Java ClassLoader 是一个重要的 Java运行时系统组件。它负责在运行时查找和装入类文件的类。
 
22. 什么是触发器和存储过程?
触发器是存储在数据库中的块,这些块一旦被构造后,就可以多次执行,当触发它的事件发生时调用该触发器。触发事件是指对表中数据的操作,如插入、删除和修改。
存储过程是将常用的或很复杂的工作,预先用 SQL 语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时 ,
只需调用 execute, 即可自动完成命令。我的理解就是一堆 sql 的集合,可以建立非常复杂的查询,编译运行,所以运行一次后,以后再运行速度比单独执行 SQL 快很多。
 
UML 方面:
标准建模语言 UML 。用例图 , 静态图 ( 包括类图、对象图和包图 ), 行为图 , 交互图 ( 顺序图 , 合作图), 实现图 Servlet&Jsp 部分:
1.MVC 的各个部分都有那些技术来实现 ? 如何实现 ?
MVC Model View Controller 的简写。 "Model" 代表的是应用的业务逻辑(通过 JavaBean, EJB 组件实现), "View" 是应用的表示面(由 JSP 页面产生), "Controller" 是提供应用的处
理过程控制(一般是一个 Servlet ),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。
 
2.servlet 的生命周期:
web 容器加载 servlet ,生命周期开始。
通过调用 servlet init() 方法进行 servlet 的初始化。
通过调用 service() 方法实现,根据请求的不同调用不同的 doGet() 或者 doPost() 方法。
结束服务, web 容器调用 servlet destroy() 方法。
 
3. jsp与servlet的区别及联系:
JSP 是Servlet 技术的扩展,本质上是Servlet 的简易方式,更强调应用的外表表达。JSP
编译后是"类servlet"。Servlet 和JSP 最主要的不同点在于,Servlet 的应用逻辑是在Java
文件中,并且完全从表示层中的HTML 里分离开来。而JSP 的情况是Java 和HTML 可以
组合成一个扩展名为.jsp 的文件。JSP 侧重于视图,Servlet 主要用于控制逻辑。
 
4. 数据库连接池的工作机制:
J2EE 服务器启动的时候,会创建一定数量的池连接,并维持不少于此数量的池连接。
程序需要时,池驱动程序会返回一个未使用的池连接并将其标记为忙。
如果当前没有空闲连接,池驱动会新建一批,数量由配置参数决定。
当调用池连接完成后,池驱动将此连接标记为空闲,其他调用就可以使用这个连接。
 
5 .jsp 有哪些内置对象 ? 作用分别是什么 ?
答: JSP 共有以下 9 种基本内置组件(可与 ASP 6 种内部组件相对应):
request 用户端请求,此请求会包含来自 GET/POST 请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet 的构架部件
page JSP 网页本身
exception 针对错误网页,未捕捉的例外
 
6.forward redirect 的区别:
答: forward 是服务器请求资源,服务器直接访问目标地址的 URL ,把那个 URL 的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来
的,所以它的地址栏中还是原来的地址。
redirect 就是服务端根据逻辑 , 发送一个状态码 , 告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以 session,request 参数都可以获取。
 
7.Jsp 的四种范围:
page 否是代表与一个页面相关的对象和属性。作用域在当前页。
request 是是代表与Web 客户机发出的一个请求相关的对象和属性。
session 只要访问的浏览器不关闭,作用域就一直存在。
application 只要访问的服务器不关闭,作用域就一直存在。
 
8. 什么是 B/S 结构 ,C/S 结构?
C/S Client/Server 的缩写。服务器通常采用高性能的 PC 、工作站或小型机,并采用大型数据库系统,如 Oracle Sybase Informix SQLServer 。客户端需要安装
专用的客户端软件。
B/S Brower/Server 的缩写,客户机上只要安装一个浏览器 (Browser) ,如:
Netscape Navigator Internet Explorer ,服务器安装 Oracle Sybase Informix SQLServer 等数据库。在这种结构下,用户界面完全通过 WWW 浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。
 
9. 编码格式转换问题:
String str=new String(" 中国 ".getBytes("ISO-8859-1"),"GBK").trim();
 
JDBC&XML
1.说说 jdbc 连接数据库的步骤
1.注册驱动
2.获得连接
3.执行 sql 语句
4.获得结果集,进行结果集的处理
5.关闭结果集
6.关闭连接,释放资源
 
statement preparedstatement 的区别
1.statement preparedstatemnet 的父类。
2.statement 是直接发送 sql 语句到数据库,事先没有进行预编译。prepatedstatement 会将 sql 进行预编译,当 sql 语句要重复执行时,数据库会调用以前编译好的 sql ,所以 preparedstatement 在性能方面会更好。
3.preparedstatement 在执行 sql 时,对传入的参数进行强制类型转换,以保证数据格式与底层数据库格式一致。
 
3. 解析一个 XML 文档有哪些方式?解析有:dom sax 两种:
dom :把整个 XML 文档放入内存,适合 XML 随机访问 , 占用内存资源大。
sax :事件驱动型的 XML 解析方式,顺序读取,不用一次装载整个文件,遇到标签会触发一个事件,适和对 XML 的顺序访问,占用内存资源稍小。
 
4.XML 文档定义有几种形式?
a: 两种形式dtd schema;
b: 本质区别:schema 本身是xml 的,可以被XML 解析器解析(这也是从DTD上发展schema的根本目的);
c:有 DOM,SAX,STAX 等。
 
Oracle 数据库部分:
1. 薪水排序后薪水排名在第 3 5 的员工:
(1).select * from(select ename,sal,rownum rn from (select ename,sal from emp_44 where sal is not null order by sal desc) where rownum<6)where rn>2;
(2).select * from(select ename,sal,rownum rn from (select ename,sal from emp_44 where sal is not null order by sal desc))where rn between 3 and 5;
 
2. 删除一张表中所有数据的方式?
(1).truncate table 命令将快速删除数据表中的所有记录。
(2).delete 产生 rollback ,如果删除在数据量的表速度会很慢,同时会占用很多的rollback,segments.truncate是 DLL 操作,不产生 rollback ,速度会快一些。
 
3. 用一条 sql 语句取出所有姓名有重复的学员姓名和重复的记录数 .
select name, count(*) from student group by name having count(*) > 1 order by count(*) desc;
 
4. 去除 oracle 数据库 表中重复数据应有如下两种方法:
方法一:创建新表删除旧表法
(1)create table student1 as select distinct id, name, score from student;
(2)drop table student;
(3)rename student1 to student;
方法二:使用 rowid(地址)伪列:
删除伪列地址除了最大地址值以外的记录
delete from temp where rowid not in (select max(rowid) from temp group by id);
删除伪列地址除了最大地址值以外的记录
delete from temp where rowid not in (select min(rowid) from temp group by id);
 
三大框架部分:
1. 应用服务器有哪些:
weblogic jboss tomcat。
 
2. Hibernate 优于 JDBC 的地方:
(1). jdbc 访问数据库进行了封装,简化了数据访问层的重复代码。
(2).Hibernate 操作数据库是面向对象的操作。
 
3. hibernate工作原理:
(1).读取并解析配置文件
(2).读取并解析映射信息,创建SessionFactory
(3).打开Sesssion
(4).创建事务Transation
(5).持久化操作
(6).提交事务
(7).关闭Session
(8).关闭 SesstionFactory。
 
为什么要用:
1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
 
2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作。
 
3. hibernate 的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
 
4. J2EE 共有 23 中设计模式,说出其中几种常用的:
工厂模式( Factory )单例模式( Singleton
适配器模式( Adapter )代理模式( Proxy
模板方法模式( Template Method
 
5. Hibernate 对象状态有哪几种,并简单介绍一下。
1. 临时状态:内存对象,并没有保存在数据库
2. 持久化状态 已经保存在数据库并纳入了 session 缓存中
3. 游离状题啊 已经保存在数据库中,但没有纳入 session 缓存中
 
6.spring 的优点?
(1).降低了组件之间的耦合性 ,实现了软件各层之间的解耦
(2).可以使用容易提供的众多服务,如事务管理,消息服务等
(3).容器提供单例模式支持
(4).容器提供了 AOP 技术,利用它很容易实现如权限拦截,运行期监控等功能
(5).容器提供了众多的辅助类,能加快应用的开发
(6).spring 对于主流的应用框架提供了集成支持,如 hibernate,JPA,Struts 等
(7).spring 属于低侵入式设计,代码的污染极低
(8).独立于各种应用服务器
(9).spring 的 DI 机制降低了业务对象替换的复杂性
(10).Spring 的高度开放性,并不强制应用完全依赖于 Spring,开发者可以自由选择 spring
的部分或全部;
 
7.介绍一下Struts的工作原理?
(1). 读取配置。加载 struts 控制器。
(2). 用户请求 用户提交表单或调用 URL WEB 应用程序服务器提交一个请求,请求的数据用 HTTP 协议上传给 WEB 服务器。
(3). 通过 struts 控制器进行处理。
(4). 经过一系列的拦截器处理。
(5). 进行业务逻辑的处理。
(6). 响应用户 JSP 将结果展现给用户。
 
为什么要用:
1. JSP、Servlet、JavaBean技术的出现给我们构建强大的企业应用系统提供了可能。但用这些技术构建的系统非常的繁乱。
2. 基于Struts开发的应用:
不用再考虑公共问题
专心在业务实现上
结构统一,易于学习、维护
新手也可写出好程序
 
8.什么是 DI 机制?
依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在 spring 中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring 来完成,然后注入调用者因此也称为依赖注入。spring 以动态灵活的方式来管理对象 , 注入的两种方式,设置注入和构造注入。设置注入的优点:直观,自然构造注入的优点:可以在构造器中决定依赖关系的顺序。
 
9.什么是 AOP?
面向切面编程(AOP)完善 spring 的依赖注入(DI),面向切面编程在 spring 中主要表现为两个方面:
(1).面向切面编程提供声明式事务管理。
(2).spring 支持用户自定义的切面,面向切面编程(aop)是对面向对象编程(oop)的补充,面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,是对应用执行过程中的步骤进行抽象,从而获得步骤之间的逻辑划分。
AOP 框架具有的两个特征:
(1).各个步骤之间的良好隔离性。
(2).源代码无关性。
 
10.什么是Hibernate延迟加载?
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在 Hibernate 中提供了对实体对象的延迟加载以及
对集合的延迟加载,另外在 Hibernate3 中还提供了对属性的延迟加载。
 
11.Hibernate中类之间的关联关系有几种?(如:一对多、多对多的关系)
many-to-one、one-to-many、many-to-many、 one-to-one
 
12. 说下Hibernate的缓存机制
一、hibernate一级缓存
(1).hibernate支持两个级别的缓存,默认只支持一级缓存;
(2).每个Session内部自带一个一级缓存;
(3).某个Session被关闭时,其对应的一级缓存自动清除;
 
二、hibernate二级缓存:
(1). 二级缓存独立于 session,默认不开启;
 
13. Hibernate的查询方式:
本地 SQL 查询 、Criteria、Hql
 
14. 为什么要用spring?
Spring是一个轻量级的IOC和AOP框架。
IOC(控制反转)意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转
AOP(面向切面),它将那些影响多个类的行为封装到可重用的模块中,面向对象是把问题从同类事物中抽象出来,面向切面是把问题从不同类问题中抽象出来。
 
15. struts 框架提供了哪些辅助功能
   1.自动收集数据(成员变量)
   2.支持类型转换
   3.国际化
   4.异常处理
   5.标签
 
16. struts1 和 struts2 的区别
1.struts1 控制器 servlet
   struts2 控制器 filter
2.struts 收集数据时 ActionForm Struts2 成员变量
3.struts1 execute(Resquest,Response)
   struts2 execute()
4.struts1 与 ServletAPI 耦合性强
   struts2 与 ServletAPI 耦合性低
5.struts1 没有拦截器 struts2 有拦截器(可以使代码各司其职)
6.struts1 只能使用 jstl 标签,而 struts2 提供了 OGNL 表达式
### Java面试题总结与资源获取 对于Java开发人员来说,掌握常见的面试问题是至关重要的。以下是关于Java面试的相关资料和题库的信息: #### 常见Java面试问题汇总 一份全面的2025年Java面试题已经在北京地区的实际面试经验基础上进行了整理[^1]。这些题目涵盖了大部分基础知识点以及一些高级概念的应用场景,可以直接用于准备面试。 #### 多线程实现方式 在多线程编程方面,可以通过继承`Thread`类或者实现`Runnable`接口来创建新的线程实例。以下是一个简单的例子展示了如何通过这两种方法启动一个新线程[^2]: ```java // 继承Thread类的方式 public class MyThread extends Thread { public void run() { System.out.println("MyThread is running"); } public static void main(String[] args) { MyThread myThread = new MyThread(); myThread.start(); } } // 实现Runnable接口的方式 public class MyRunnable implements Runnable { @Override public void run() { System.out.println("MyRunnable is running"); } public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.start(); } } ``` #### 关于HashMap中的hash函数优化 为了减少哈希冲突并使数据更加均匀分布在桶中,JDK 1.8 对 `hash()` 函数做了改进,仅需一次位运算加上一次异或操作就能完成对高16位的有效利用[^3]: ```java static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); } ``` 这种设计不仅提高了性能还简化了代码逻辑. #### MySQL索引失效的情况分析 当涉及到数据库查询效率时,了解MySQL索引何时会失效非常重要。例如,在使用OR语句、LIKE模糊匹配开头百分号等情况都可能造成索引无法正常工作[^4]。此外还有其他多种因素也可能影响到索引的效果,比如不当的数据类型处理或是复杂的SQL表达式等。 #### 如何获得《Java面试宝典》? 目前网络上有许多免费及付费渠道可以获取高质量的学习材料和技术文档,《Java面试宝典》作为其中一种非常实用的手册可以帮助求职者更好地应对技术考核环节。建议访问正规的技术社区论坛或者官方出版平台寻找合法版本下载链接。 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值