本文目录如下:
- Java面试题
- 一、基础知识
- JDK 和 JRE 有什么区别?
- String 属于基础的数据类型吗?基础类型有哪些?
- String str="xqz"与 String str=new String("xqz")一样吗?
- java 中操作字符串都有哪些类?它们之间有什么区别?
- 如何将字符串反转?
- String 类的常用方法都有那些?
- == 和 equals 的区别是什么?
- final 在 java 中有什么作用?
- java 中的 Math.round() 方法的用法?
- try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
- 常见的异常类有哪些?
- 二、面向对象
- 如何理解面向对象编程?
- 普通类和抽象类有哪些区别?
- 浅谈一下抽象方法?
- 接口和抽象类有什么区别?
- 什么是 java 序列化?什么情况下需要序列化?
- 为什么要使用克隆?
- 如何实现对象克隆?
- 三、容器
- java 容器都有哪些?
- Collection 和 Collections 有什么区别?
- ArrayList 和 LinkedList 的区别是什么?
- 如何实现数组和 List 之间的转换?
- ArrayList 和 Vector 的区别是什么?
- Array 和 ArrayList 有何区别?
- HashMap 和 Hashtable 有什么区别?
- 如何决定使用 HashMap 还是 TreeMap?
- 简单说一下 HashMap 的实现原理?
- 说一下 HashSet 的实现原理?
- 在 Queue 中 poll()和 remove()有什么区别?
- Iterator 怎么使用?有什么特点?
- 四、并发编程
- 线程和进程的区别?
- 守护线程是什么?
- 创建线程有哪几种方式?
- 线程有哪些状态?
- sleep() 和 wait() 有什么区别?
- 线程的 run()和 start()有什么区别?
- 在 java 程序中怎么保证多线程的运行安全?
- 什么是死锁?
- 五、IO
- Java 中 IO 流分为几种?
- BIO、NIO、AIO 有什么区别?
- Files的常用方法都有哪些?
- 六、设计模式
- 说几个常用的设计模式?
- 七、通信/网络
- 简述 tcp 和 udp的区别?
- OSI 的七层模型都有哪些?
- get 和 post 请求有哪些区别?
- 八、Spring Boot
- session 和 cookie 有什么区别?
- 为什么使用Spring Boot?
- Spring Boot 核心配置文件是什么?
- Spring Boot 有哪些方式可以实现热部署
- 解释一下什么是面向切片编程AOP?
- @RequestMapping 的作用是什么?
- @Autowired 的作用是什么?
- 什么是 Spring Cloud?
- 九、Mybatis
- 什么是 ORM 框架?
- Mybatis 有几种分页方式?
- Mybatis 逻辑分页和物理分页的区别是什么?
- 十、MySQL
- 数据库的三范式是什么?
- MySQL常用的存储引擎有哪些?
- MySQL中char 和 varchar 的区别是什么?
- MySQL的内连接、左连接、右连接有什么区别?
- MySQL索引是怎么实现的?
- 说一下 MySQL 的行锁和表锁?
- MySQL 问题排查都有哪些手段?
- 如何做 mysql 的性能优化?
- 十一、Redis
- Redis 是什么?都有哪些使用场景?
- Redis 支持的数据类型有哪些?
- Redis 有哪些功能?
- Redis 和 Memecache 有什么区别?
- Redis 为什么是单线程的?
- 什么是缓存穿透?怎么解决?
- Jedis 和 Redisson 有哪些区别?
- 怎么保证缓存和数据库数据的一致性?
- Redis 持久化有几种方式?
- 十二、JVM
- 说一下 jvm 的主要组成部分?及其作用?
- 说一下堆和栈的区别?
Java面试题
一、基础知识
JDK 和 JRE 有什么区别?
- JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
- JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。
String 属于基础的数据类型吗?基础类型有哪些?
点击查看
String不是基本数据类型,而是一个类(class)。
基础类型有 8 种:
- 整数类: byte, short, int, long
- 浮点类: double, float
- 逻辑类: boolean
- 文本类: char
String str="xqz"与 String str=new String(“xqz”)一样吗?
点击查看
不一样
- String str=“xqz”: java虚拟机会把它分配到常量池中。
- String str=new String(“i”): 创建了一个对象,会被分到堆内存中。
java 中操作字符串都有哪些类?它们之间有什么区别?
- String 声明的是不可变的对象,每次操作都会生成新的 String 对象。而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作。
- StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的。
- StringBuilder 的性能高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
如何将字符串反转?
使用 StringBuilder 或者 StringBuffer 的
reverse()
方法。
String 类的常用方法都有那些?
查看更多
- length():返回字符串长度。
- indexOf():返回指定字符的索引。
- charAt():返回指定索引处的字符。
- split():分割字符串,返回一个分割后的字符串数组。
- substring():截取字符串。
== 和 equals 的区别是什么?
点击查看
- == 对于基本类型来说是值比较,对于引用类型来说是比较的是引用;
- equals 比较的是值是否相等。
final 在 java 中有什么作用?
点击查看
- final修饰变量
当final修饰的是一个基本数据类型数据时, 这个数据的值在初始化后将不能被改变。(常量)- final修饰方法(如:Object的getClass方法)
首要作用是锁定方法, 不让任何继承类对其进行修改。- final修饰类(如:String、System类等)
表示类不可被继承。修饰的类所有成员方法都将被隐式修饰为final方法。
java 中的 Math.round() 方法的用法?
查看更多案例
Java中的
Math.round()
方法是将浮点型进行“四舍五入”转换为int类型的一个方法。
- 例1: Math.round(-11.5) -> 输出为 -11
- 例2: Math.round(11.5) -> 输出为 12
try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
会执行,在 return 前执行。
常见的异常类有哪些?
- NullPointerException:当应用程序试图访问空对象时,则抛出该异常。
- IndexOutOfBoundsException:指示某排序索引(例如对数组、字符串或向量的排序)超出范围时抛出。
- IOException:当发生某种I/O异常时,抛出此异常。此类是失败或中断的I/O操作生成的异常的通用类。
二、面向对象
如何理解面向对象编程?
1、万物皆对象,任何事物都可以在代码中用对象表达出来。
2、对象包含自己的属性和行为。创建对象,就是创建对象的描述,设计对象的行为。
3、编程的过程,就是不断的创建对象,并设计对象的行为。
普通类和抽象类有哪些区别?
- 普通类不能包含抽象方法,抽象类可以包含抽象方法。
- 抽象类不能直接实例化,普通类可以直接实例化。
浅谈一下抽象方法?
- Abstract 关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体,具体实现由它的子类确定。
- 抽象方法只能在抽象类中进行创建。且子类必须重写父类的抽象方法(抽象类除外)。
接口和抽象类有什么区别?
- 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
- 构造函数:抽象类可以有构造函数;接口不能有。
- main 方法:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
- 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。
- 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。
什么是 java 序列化?什么情况下需要序列化?
序列化是为了保存内存中的各种对象的状态,并且可以把保存的对象状态再读出来。
为什么要使用克隆?
对克隆出来的对象进行操作,不会影响原来的对象。
如何实现对象克隆?
实现Cloneable接口并重写Object类中的
clone()
方法;
三、容器
java 容器都有哪些?
Java中Set(集合), List(列表)与Map(映射)的区别: 查看详情 (注:Set集合中没有重复值)
Collection 和 Collections 有什么区别?
点击查看
Collection
是集合的顶层接口,本身是一个Interface接口,里面包含了一些集合的基本操作,需要实例化Collection下的list、set、map、vector接口才能调用里面的方法。Collections
类是Java中集合的工具类,服务于Collection框架,不能实例化。Collections 类中的方法都是静态方法,要调用内部方法直接用类名调用(Collections.sort)。
ArrayList 和 LinkedList 的区别是什么?
- ArrrayList底层的数据结构是数组, 支持随机访问
- LinkedList 的底层数据结构是双向循环链表,不支持随机访问。
- ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。
如何实现数组和 List 之间的转换?
- List转换成为数组:调用ArrayList的
toArray
方法。- 数组转换成为List:调用Arrays的
asList
方法。
ArrayList 和 Vector 的区别是什么?
- Vector 是线程安全的。
- ArrayList 不是线程安全的。
Array 和 ArrayList 有何区别?
点击查看
- Array:只可存储基本数据类型和对象; ArrayList:只能存储对象。
- Array:被设置为固定大小; ArrayList:是一个可变数组,大小可自动调整。
- Array所包含的方法没有ArrayList多。
HashMap 和 Hashtable 有什么区别?
点击查看
- 线程安全性:Hashtable是线程安全的。HashMap是线程不安全的。
- 是否允许存在null:Hashtable中key和value都不允许出现null值。HashMap:null可以作为键和值(只能有一个null键)。
- 是否提供contains方法:HashMap:它去掉了Hashtable的contains方法,保留了containsKey和containsValue。而Hashtable包含这三种方法。
如何决定使用 HashMap 还是 TreeMap?
- HashMap:基于哈希表实现。
- TreeMap:基于红黑树实现。(注:TreeMap默认是按照Key值升序排序)。
- 对比:对于在Map中插入、删除和定位元素这类操作,HashMap是最好的选择。然而,假如你需要对一个有序的key集合进行遍历,TreeMap是更好的选择。
简单说一下 HashMap 的实现原理?
- HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
- 当链表中的节点数超过8个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)。
说一下 HashSet 的实现原理?
- HashSet底层由HashMap实现。
- HashSet的值存放于HashMap的key上。
在 Queue 中 poll()和 remove()有什么区别?
poll() 和 remove() 都是从队列中取出一个元素:
poll()
在获取元素失败的时候会返回null。remove()
失败的时候会抛出异常。
Iterator 怎么使用?有什么特点?
Java中的Iterator功能比较简单,并且只能单向移动:
- (1) 使用next()获得序列中的下一个元素。
- (2) 使用hasNext()检查序列中是否还有元素。
- (3) 使用remove()将迭代器新返回的元素删除。
四、并发编程
线程和进程的区别?
- 进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。
- 线程是进程的一个实体,是cpu调度和分派的基本单位,多个线程共享内存资源,减少切换次数,从而效率更高。
守护线程是什么?
- 守护线程(即daemon thread),是个服务线程,准确地来说就是服务其他的线程。
创建线程有哪几种方式?
- 1.继承Thread类创建线程类: 定义Thread类的子类,并重写该类的run方法,该run方法的方法体就代表了线程要完成的任务。
- 2.通过Runnable接口创建线程类: 定义runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体。
线程有哪些状态?
- 线程通常都有五种状态,创建、就绪、运行、阻塞和死亡。
sleep() 和 wait() 有什么区别?
sleep()
:**sleep()**是线程类 (Thread类) 的静态方法,让调用线程进入睡眠状态,让出执行机会给其他线程。休眠但不会释放锁。wait()
:wait()是Object类的方法,当一个线程执行到wait方法时,它就它就进入该对象相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过notify,notifyAll方法来唤醒等待的线程。
线程的 run()和 start()有什么区别?
run()
: 线程体。它包含了线程要执行的内容。start()
: 用于启动线程。
在 java 程序中怎么保证多线程的运行安全?
查看实现方式
线程安全在三个方面体现:
- 原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作,(
atomic
+synchronized);- 可见性:一个线程对主内存的修改可以及时地被其他线程看到,(synchronized+
volatile
);- 有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序(
volatile
)。
什么是死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态。
五、IO
Java 中 IO 流分为几种?
- 按功能来分:输入流(input)、输出流(output)。
- 按类型来分:字节流 和 字符流。
- 字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。
BIO、NIO、AIO 有什么区别?
查看原理
BIO
:Block IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。NIO
:New IO 同步非阻塞 IO,是传统 IO 的升级,客户端和服务器端通过 Channel(通道) 通讯,实现了多路复用。AIO
:Asynchronous IO 是 NIO 的升级,也叫 NIO2,实现了 异步非堵塞 IO ,异步 IO 的操作基于事件和回调机制。
Files的常用方法都有哪些?
- Files.exists():检测文件路径是否存在。
- Files.createFile():创建文件。
- Files.createDirectory():创建文件夹。
- Files.read():读取文件。
- Files.write():写入文件。
- Files.delete():删除一个文件或目录。
六、设计模式
说几个常用的设计模式?
点击查看
- 单例模式: 一个应用程序中,某个类的实例对象只能有一个。
- 观察者模式: 对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。(本质就是
调用
其他对象的函数)- 装饰者模式: 对已有的业务逻辑进一步的封装,使其增加额外的功能。(依赖
继承
实现, 不断加料)- 适配器模式: 把一个类的接口变换成客户端所期待的另一种接口。(创建一个
中间类
来解决无法调用的问题)
七、通信/网络
简述 tcp 和 udp的区别?
- TCP面向连接; UDP是无连接的。
- TCP提供可靠的服务。保证数据无差错,不丢失,不重复,且按序到达; UDP尽最大努力交付,不保证可靠交付。
- UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高要求的通信。
OSI 的七层模型都有哪些?
- 应用层:网络服务与最终用户的一个接口。
- 传输层:定义传输数据的协议端口号,以及流控和差错校验。
- 网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。
- 数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。
- 物理层:建立、维护、断开物理连接。
get 和 post 请求有哪些区别?
- GET参数通过URL传递,POST放在Request body中。
- GET请求在URL中传送的参数是有长度限制的,而POST没有。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置。
八、Spring Boot
session 和 cookie 有什么区别?
点击查看
- session保存在服务器端(客户端仅保存一个sessionID),Cookie保存在客户端。
- session保存的是对象,Cookie保存的是字符串。cookie的存储限制数据量不大于4KB,而session的容量则是无限量的。
- session在会话结束后就会关闭,但是Cookie可以经过持久化而长期保存在客户端的本地硬盘上。所以session也更安全。
为什么使用Spring Boot?
- 零配置。无冗余代码生成和XML 强制配置,遵循“约定大于配置” 。
- 内嵌容器: 省去了配置Tomcat的繁琐。
- 与主流框架集成简单: 大量第三方库开箱即用。
- Spring是一个轻量级的 控制反转(IoC) 和 面向切面(AOP) 的容器框架。
- SpringBoot是一个服务于框架的框架,服务范围是简化配置文件
Spring Boot 核心配置文件是什么?
Spring Boot提供了两种常用的配置文件:
properties文件
yml文件
Spring Boot 有哪些方式可以实现热部署
点击查看
Spring Boot热部署实现有两种方式:
- 1.使用spring-boot-devtools
- 2.使用spring loaded
解释一下什么是面向切片编程AOP?
- 所谓切片,其实就是: 将那些与业务无关,却为业务模块所共同调用的逻辑或方法封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
- AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。
@RequestMapping 的作用是什么?
- RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
@Autowired 的作用是什么?
- @Autowired 是一个注解,它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。
- @Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。
什么是 Spring Cloud?
- Spring Cloud 就是致力于分布式系统、云服务的框架。
- Spring Cloud 为开发人员提供了快速构建分布式系统中一些常见模式的工具。
九、Mybatis
什么是 ORM 框架?
对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
Mybatis 有几种分页方式?
点击查看
- LIMIT关键字: 缺点: 实现复杂。
- RowBounds实现分页: 缺点: DB压力比较大,因为将结果暂存在db了。
Mybatis 逻辑分页和物理分页的区别是什么?
点击查看
- 逻辑分页:同时逻辑分页是先查询出所有的数据,再根据代码块的所需。
- 物理分页:通过LIMIT实现分页。(更侧重于sql语句)
十、MySQL
数据库的三范式是什么?
- 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
- 第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
- 第三范式:任何非主属性不依赖于其它非主属性。
MySQL常用的存储引擎有哪些?
点击查看
MyISAM
:
- 优点:查询数据相对较快,适合大量的select,可以全文索引。
- 缺点:不支持事务,不支持外键,并发量较小,不适合大量update。
InnoDB
:
- 优点:支持事务,支持外键,并发量较大,适合大量update。
- 缺点:查询数据相对较慢,不适合大量的select。
MySQL中char 和 varchar 的区别是什么?
- char(n) :缺点:占用空间;适用场景:存储密码的 md5 值。
- varchar(n) :可变长度,存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。
总结:从空间上考虑 varcahr 比较合适;从效率上考虑 char 比较合适。
MySQL的内连接、左连接、右连接有什么区别?
- 内连接关键字:
inner join
;左连接:left join
;右连接:right join
。- 内连接是把匹配的关联数据显示出来;左连接是左边的表全部显示出来,右边的表显示出符合条件的数据;右连接正好相反。
MySQL索引是怎么实现的?
主流的数据库引擎的索引都是 B+ 树实现的,B+ 树的搜索效率,可以到达二分法的性能,所以索引的性能也是更好的。
说一下 MySQL 的行锁和表锁?
- MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。
- 表级锁:开销小,加锁快,不会出现死锁。锁粒度大,发生锁冲突的概率高,并发量低。
- 行级锁:开销大,加锁慢,会出现死锁。锁粒度小,发生锁冲突的概率小,并发度高。
MySQL 问题排查都有哪些手段?
- 使用 show processlist 命令查看当前所有连接信息。
- 使用 explain 命令查询 SQL 语句执行计划。
- 开启慢查询日志,查看慢查询的 SQL。
如何做 mysql 的性能优化?
- 为搜索字段创建索引。
- 避免使用 select *,列出需要查询的字段。
- 选择正确的存储引擎。
十一、Redis
Redis 是什么?都有哪些使用场景?
Redis是一个开源的、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis 使用场景:
- 海量数据的读写
- 数据高并发的读写
- 对扩展性要求高的数据
Redis 支持的数据类型有哪些?
点击查看
string
(字符串)hash
(哈希): string 类型的字段(key) 和 值(value) 的映射表,通常用来存储对象使用。list
(列表): string列表; 一般用于消息队列、缓存列表等场景下。set
(集合): string类型的无序集合,集合中不能出现重复的数据。zset
(sorted set:有序集合): string类型的有序集合。
Redis 有哪些功能?
- 数据缓存功能
- 分布式锁的功能
- 支持数据持久化
- 支持消息队列
Redis 和 Memecache 有什么区别?
- Memcached所有的值均是简单的字符串,Redis支持更为丰富的数据类型。
- Redis的速度比Memcached快很多。
- Redis可以持久化其数据。
Redis 为什么是单线程的?
因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。
什么是缓存穿透?怎么解决?
缓存穿透:指查询数据库中没有的数据,缓存无法命中,每次请求都要到数据库去查询,造成缓存穿透。
解决方案:最简单的方法如果一个查询返回的数据为空,我们就把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
Jedis 和 Redisson 有哪些区别?
Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。
Redisson和Jedis相比,功能较为简单,不支持排序、事务、管道、分区等Redis特性。
怎么保证缓存和数据库数据的一致性?
- 合理设置缓存的过期时间。
- 新增、更改、删除数据库操作时同步更新 Redis。
Redis 持久化有几种方式?
Redis 的持久化有两种方式:
RDB
(Redis Database):指定的时间间隔能对你的数据进行快照存储。AOF
(Append Only File):每一个收到的写命令都通过write函数追加到文件中。
十二、JVM
说一下 jvm 的主要组成部分?及其作用?
- 类加载器(ClassLoader)
- 运行时数据区(Runtime Data Area)
- 执行引擎(Execution Engine)
- 本地库接口(Native Interface)
说一下堆和栈的区别?
- 栈内存存储的是局部变量。堆内存存储的是实体。
- 栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短。
- 栈内存存放的变量在生命周期结束时释放。堆内存存放的实体会被垃圾回收机制不定时的回收。