目录
一、JDK 和 JRE 有什么区别?
二、== 和 equals 的区别是什么?
三、hashcode是什么?有什么作用?
四、Java 容器都有哪些?
五、Collection 和 Collections 有什么区别?
六、List、Set、Map 之间的区别是什么?
七、Synchronized 用过吗,其原理是什么?
八、jsp 和 servlet 有什么区别?
九、请列举出在 JDK 中几个常用的设计模式?
十、什么是 Spring 框架?Spring 框架有哪些主要模块?
十一、使用 Spring 框架能带来哪些好处?
十二、什么是 Spring Boot?Spring Boot 有哪些优点?
十三、为什么要使用 hibernate?
十四、mybatis 中 #{}和 ${}的区别是什么?
十五、RabbitMQ的使用场景有哪些?
十六、数据库的三范式是什么?
十七、Redis是什么?都有哪些使用场景?
十八、说一下 jvm 的主要组成部分?及其作用?
十九、说一下 jvm 运行时数据区?
一、JDK 和 JRE 有什么区别?
JDK(Java Development Kit),Java开发工具包
JRE(Java Runtime Environment),Java运行环境
JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。
二、== 和 equals 的区别是什么?
1、对于基本类型,==比较的是值;
2、对于引用类型,==比较的是地址;
3、equals不能用于基本类型的比较;
4、如果没有重写equals,equals就相当于==;
5、如果重写了equals方法,equals比较的是对象的内容;
三、hashcode是什么?有什么作用?
Java中Object有一个方法:
public native int hashcode();
1、hashcode()方法的作用
hashcode()方法主要配合基于散列的集合一起使用,比如HashSet、HashMap、HashTable。
当集合需要添加新的对象时,先调用这个对象的hashcode()方法,得到对应的hashcode值,实际上hashmap中会有一个table保存已经存进去的对象的hashcode值,如果table中没有改hashcode值,则直接存入,如果有,就调用equals方法与新元素进行比较,相同就不存了,不同就存入。
2、equals和hashcode的关系
- 如果equals为true,hashcode一定相等;
- 如果equals为false,hashcode不一定不相等;
- 如果hashcode值相等,equals不一定相等;
- 如果hashcode值不等,equals一定不等;
3、重写equals方法时,一定要重写hashcode方法
四、Java 容器都有哪些?
1、Collection
(1)set
HashSet、TreeSet
(2)list
ArrayList、LinkedList、Vector
2、Map
HashMap、HashTable、TreeMap
五、Collection 和 Collections 有什么区别?
1、Collection是最基本的集合接口,Collection派生了两个子接口list和set,分别定义了两种不同的存储方式。
2、Collections是一个包装类,它包含各种有关集合操作的静态方法(对集合的搜索、排序、线程安全化等)。
此类不能实例化,就像一个工具类,服务于Collection框架。
六、List、Set、Map 之间的区别是什么?
1、List
- 有序可重复
- 和数组类似,list可以动态增长,查找元素效率高,插入删除效率低,因为会引起其他元素位置改变。
2、Set
- 无序不可重复
- 查询效率低,删除和插入效率高,插入和删除不会引起其他元素位置改变。
3、Set和List具体子类
Set
|————HashSet:以哈希表的形式存放元素,插入删除速度很快。
List
|————ArrayList:动态数组
|————LinkedList:链表、队列、堆栈。
4、map
map接口不是继承自collection接口,是不重复的键到值的映射。包括HashMap、Hashtable、TreeMap。
七、Synchronized 用过吗,其原理是什么?
Java多线程基础知识总结(绝对经典)
八、jsp 和 servlet 有什么区别?
1、servlet是服务器端的Java程序,它担当客户端和服务端的中间层。
2、jsp全名为Java server pages,中文名叫Java服务器页面,其本质是一个简化的servlet设计。JSP是一种动态页面设计,它的主要目的是将表示逻辑从servlet中分离出来。
3、JVM只能识别Java代码,不能识别JSP,JSP编译后变成了servlet,web容器将JSP的代码编译成JVM能够识别的Java类(servlet)。
4、JSP有内置对象、servlet没有内置对象。
九、请列举出在 JDK 中几个常用的设计模式?
1、单例模式
作用:保证类只有一个实例。
JDK中体现:Runtime类。
2、静态工厂模式
作用:代替构造函数创建对象,方法名比构造函数清晰。
JDK中体现:Integer.valueOf、Class.forName
3、抽象工厂
作用:创建某一种类的对象。
JDK中体现:Java.sql包。
4、原型模式
clone();
原型模式的本质是拷贝原型来创建新的对象,拷贝是比new更快的创建对象的方法,当需要大批量创建新对象而且都是同一个类的对象的时候考虑使用原型模式。
一般的克隆只是浅拷贝(对象的hash值不一样,但是对象里面的成员变量的hash值是一样的)。
有些场景需要深拷贝,这时我们就要重写clone方法,以ArrayList为例:
5、适配器模式
作用:使不兼容的接口相容。
JDK中体现:InputStream、OutputStream。
6、装饰器模式
作用:为类添加新的功能,防止类继承带来的类爆炸。
JDK中体现:io类、Collections、List。
7、外观模式
作用:封装一组交互类,一直对外提供接口。
JDK中体现:logging包。
8、享元模式
作用:共享对象、节省内存。
JDK中体现:Integer.valueOf、String常量池。
9、代理模式
作用:
(1)透明调用被代理对象,无须知道复杂实现细节;
(2)增加被代理类的功能;
JDK中体现:动态代理。
10、迭代器模式
作用:将集合的迭代和集合本身分离。
JDK中体现:Iterator
11、命令模式
作用:封装操作,使接口一致。
JDK中体现:Runable、Callable、ThreadPoolExecutor。
十、什么是 Spring 框架?Spring 框架有哪些主要模块?
Spring是一个控制反转和面向切面的容器框架。
Spring有七大功能模块:
1、Core
Core模块是Spring的核心类库,Core实现了IOC功能。
2、AOP
Apring AOP模块是Spring的AOP库,提供了AOP(拦截器)机制,并提供常见的拦截器,供用户自定义和配置。
3、orm
提供对常用ORM框架的管理和支持,hibernate、mybatis等。
4、Dao
Spring提供对JDBC的支持,对JDBC进行封装。
5、Web
对Struts2的支持。
6、Context
Context模块提供框架式的Bean的访问方式,其它程序可以通过Context访问Spring的Bean资源,相当于资源注入。
7、MVC
MVC模块为spring提供了一套轻量级的MVC实现,即Spring MVC。
十一、使用 Spring 框架能带来哪些好处?
1、轻量级框架、容器
Spring是一个容器,管理对象的生命周期和配置。基于一个可配置原型prototype,你的bean可以使单利的,也可以每次需要时都生成一个新的实例。
2、控制反转IOC
Spring通过控制反转实现松耦合。
3、支持AOP
Spring提供对AOP的支持,它允许将一些通用任务,如安全、事务、日志等进行集中式处理,从而提高了程序的复用性。
4、轻量级框架
5、方便测试
Spring提供Junit4的支持,可以通过注解方便测试spring程序。
6、对Java中很多API进行了封装
7、方便集成各种优秀框架
如Struts、hibernate、mybstis。
8、支持声明式事务处理
只需通过配置就可以完成对事务的管理,而无须手动编程。
十二、什么是 Spring Boot?Spring Boot 有哪些优点?
1、Spring Boot简介
基于Spring4.0设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突、引用的不稳定性得到了解决。
2、Spring Boot 有哪些优点?
- 快速构建项目,可以选一些必要的组件;
- 对主流框架的无配置集成;
- 内嵌Tomcat容器,项目可独立运行;
- 删除了繁琐的xml配置文件;
- 极大地提高了开发和部署效率;
- 提供starter,简化maven配置;
3、SpringBoot有哪些缺点?
- 版本迭代速度快,一些模块改动很大;
- 由于无须配置,报错时很难定位;
十三、为什么要使用 hibernate?
1、hibernate对jdbc进行了封装,简化了JDBC的重复性代码;
2、hibernate对dao有一个封装类hibernateTemplate,可以继承它,实现简单的CRUD接口。
3、hibernate使用注解和配置文件,可以对实体类和映射文件进行映射;
4、hibernate有事务管理机制,保证了数据的安全性;
5、hibernate有一级缓存和二级缓存;
十四、mybatis 中 #{}和 ${}的区别是什么?
1、#{}带引号,${}不带引号;
2、#{}可以防止SQL注入;
3、${}常用于数据库表名、order by子句;
4、一般能用#{}就不要使用${};
十五、RabbitMQ的使用场景有哪些?
1、解决异步问题
例如用户注册,发送邮件和短信反馈注册成功,可以使用RabbitMQ消息队列,用户无需等待反馈。
2、服务间解耦
订单系统和库存系统,中间加入RabbitMQ消息队列,当库存系统出现问题时,订单系统依旧能正常使用,降低服务间耦合度。
3、秒杀系统
利用RabbitMQ的最大值,实现秒杀系统。
十六、数据库的三范式是什么?
1、列不可再分;
2、每一行数据只做一件事,只与一列相关,主键;
3、每个属性都与主键有直接关系,而不是间接关系;
三大范式只是设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情结,当然要特殊对待,数据库设计最重要的是看需求和性能,需求>性能>表结构。
所以不能一味的追求三范式建立数据库。
十七、Redis是什么?都有哪些使用场景?
1、Redis是什么?
- Redis是非关系型、基于内存的数据库,提供一定的持久化工厂,提供键值对形式的数据存储,数据类型包括string、list、set、hash等;
- Redis支持多语言,使用方便;
- 支持每秒十几万的读写操作,性能远超关系型数据库,支持集群、分布式、主从同步;
- 具有一定的事务能力,保证了高并发的场景下数据的安全性和一致性;
2、Redis都有哪些使用场景?
- 读取缓存用的数据(读操作远大于写操作的数据),比如首页。
- 高速读写场合,如秒杀,抢红包等高并发场景。
十八、说一下 jvm 的主要组成部分?及其作用?
JVM包括类加载子系统、堆、方法区、栈、本地方法栈、程序计数器、直接内存、垃圾回收器、执行引擎。
1、类加载子系统
类加载子系统负责加载class信息,加载的类信息存放于方法区中。
2、直接内存
直接内存是在Java堆外的、直接向系统申请的内存空间。访问直接内存的速度会由于Java堆。出于性能的考虑,读写频繁的场合可能会考虑使用直接内存。
3、垃圾回收器
垃圾回收器可以对堆、方法区、直接内存进行回收。
4、执行引擎
执行引擎负责执行虚拟机的字节码,虚拟机会使用即时编译技术将方法编译成机器码后再执行。
十九、说一下 jvm 运行时数据区?
运行时数据区包括堆、方法区、栈、本地方法栈、程序计数器。
1、堆
堆解决的是对象实例存储的问题,垃圾回收器管理的主要区域。
2、方法区
方法区可以认为是堆的一部分,用于存储已被虚拟机加载的信息,常量、静态变量、即时编译器编译后的代码。
3、栈
栈解决的是程序运行的问题,栈里面存的是栈帧,栈帧里面存的是局部变量表、操作数栈、动态链接、方法出口等信息。
- 栈帧
每个方法从调用到执行的过程就是一个栈帧在虚拟机栈中入栈到出栈的过程。
- 局部变量表
用于保存函数的参数和局部变量。
- 操作数栈
操作数栈又称操作栈,大多数指令都是从这里弹出数据,执行运算,然后把结果压回操作数栈。
4、本地方法栈
与栈功能相同,本地方法栈执行的是本地方法,一个Java调用非Java代码的接口。
5、程序计数器(PC寄存器)
程序计数器中存放的是当前线程所执行的字节码的行数。JVM工作时就是通过改变这个计数器的值来选取下一个需要执行的字节码指令。
上一篇:Java面试题总结(绝对经典)
下一篇:如果当时这15道题能答好,现在应该已经被录取了(记一次面试的亲身经历 2020-7-23)