Java高频面试题(2023最新版)
- Java基础
- 1、JDK 和 JRE 有什么区别?
- 2、== 和 equals 的区别是什么?
- 3、final 在 java 中有什么作用?
- 4、java 中的 Math.round(-11.3) 等于多少?
- 5、String str="i"与 String str=new String(“i”)一样吗?
- 6、new String("a") + new String("b") 会创建几个对象?
- 7、如何将字符串反转?
- 8、String 类的常用方法都有那些?
- 9、String、String buffer和String builder区别?
- 10、 字符串拼接问题
- 11、什么是自动拆装箱? int和Integer有什么区别?以及以下程序运行结果。
- 12、类和对象的关系
- 13、怎么理解面向对象?
- 14、接口与抽象类的区别?
- 15、重载与重写有什么区别?
- 16、为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么?
- 17、java 中 IO 流分为几种?
- 18、 常见的IO模型:BIO、NIO、AIO
- 19、什么是 java 序列化?怎么实现序列化
- 20、final、finally、finalize的区别?
- 21、Object中有哪些方法?
- 22、异常相关
- 23、hashcode是什么?有什么作用?
- 24、谈谈你对反射的理解?
- 25、linux常用命令
- 26、docker常用命令
- 集合
- 1、数组和集合的区别
- 2、说一下集合体系?
- 3、说一下ArrarList和LinkedList区别?
- 4、ArrayList和Vector的底层原理和扩容机制
- 5、HashMap底层原理?
- 6、HashMap中put方法具体流程?
- 7、HashMap扩容机制?
- 8、HashMap的寻址算法?
- 9、HashMap 多线程操作导致死循环问题
- 10、哈希表的底层数组长度为什么是 2 的 n 次方?
- 11、HashMap和HashTable区别?
- 12、哪些集合类是线程安全的?
- 13、Hashmap树化链表长度为什么是8?负载因子为什么是0.75?
- 14、JDK7与JDK8中HashMap的不同点?
- 15、ConcurrentHashMap是怎么保证并发安全的?
- 16、fail-safe和fail-fast有了解吗?
- JavaWeb
- 1、Javaweb的三大组件
- 2、JSP 和 Servlet 的区别
- 3、拦截器和过滤器的区别
- 4、Http 常见的状态码有哪些?
- 5、GET 和POST 的区别?
- 6、Cookie 和Session 的区别
- 7、转发和重定向的区别?(至少写3个)
- 8、说出几种vue当中的指令及其用法?
- 9、说出vue的声明周期?(vue2、vue3)
- 10、thymeleaf是什么?常用的标签
- 11、什么是 XSS 攻击,如何避免?
- 12、 什么是 CSRF 攻击,如何避免?
- Spring
- 1、谈谈你对Spring的理解
- 2、SpringAOP和AspectJ的区别?
- 3、介绍一下Spring bean 的生命周期?
- 4、介绍一下Spring bean 的依赖注入方式?
- 5、介绍一下Spring bean 的作用域?
- 6、请描述一下Spring 的事务管理
- 7、Spring事务的传播方式?
- 8、Spring事务失效场景?
- 8、spring中的BeanFactory和FactoryBean的区别是什么?
- 9、Spring的Bean对象的定义方式有几种?
- 10、什么是BeanDefinition?BeanDefinition中有哪些属性?
- 11、@Autowired和@Resource有什么区别?
- 12、Spring中常用的设计模式?
- 13、Spring循环依赖
- 1、什么是循环依赖?
- 2、三级缓存?
- 3、为什么在java中对象中属性依赖不会出现循环依赖的现象而在spring就会出现循环依赖?
- 4、如何解决循环依赖的?
- 5、那如果只有一级缓存和三级缓存是否可行?
- SpringMvc
- 1、简单的谈一下SpringMVC的工作流程?
- 2、说出Spring或者SpringMVC中常用的5个注解,并解释含义
- 3、简述SpringMVC中如何返回JSON数据
- 4、Spring MVC怎么实现统一异常处理?
- Mybatis
- 1、MyBatis中 #{}和${}的区别是什么?
- 2、Mybatis 中一级缓存与二级缓存?
- 3、MyBatis如何获取自动生成的(主)键值?
- 4、简述Mybatis的动态SQL,列出常用的6个标签及作用
- 5、Mybatis 如何完成MySQL的批量操作,举例说明
- 6、mybatis的分页
- 7、Mybatis的工作流程
- 8、Mybatis是否支持延迟加载?延迟加载的原理是什么?
- 9、Mybatis有哪些执行器?
- SpringBoot/SpringCloud
- 1、谈谈怎么理解SpringBoot框架?
- 2、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
- 3、Spring Boot 自动配置原理是什么?
- 4、SpringBoot配置文件有哪些?加载顺序?怎么实现多环境配置?
- 5、SpringBoot和SpringCloud是什么关系
- 6、SpringCloud都用过哪些组件?介绍一下作用
- 7、nacos、eureka的区别?
- 8、Nacos作用以及注册中心的原理
- 9、服务注册和发现是什么意思?Spring Cloud 如何实现服务注册发现?
- 10、Feign工作原理
- 11、服务熔断和服务降级的区别
- 12、你们项目中微服务之间是如何通讯的?
- 13、你们项目的配置文件是怎么管理的 ?
- 14、你们项目中有没有做过限流 ? 怎么做的 ?
- 分布式事务
- 1、什么是分布式事务?
- 2、什么是CAP理论(分布式事务特点)?
- 3、什么是BASE?
- 4、怎么解决分布式事务?
- 5、什么是seata?
- 6、分布式全局唯一id
- Mysql
- 1、事务
- 1、SQL 的select 语句完整的执行顺序
- 2、说一下MySQL的事务和事务特性?
- 3、说一下事务的并发问题?
- 4、说一下 MySQL事务隔离级别?
- 2、索引
- 1、谈谈你对索引的理解?
- 2、索引的底层实现是什么?什么情况下会索引失效?
- 3 、索引创建原则有哪些?
- 4、聚簇索引和非聚簇索引的区别?
- 5、了解回表查询吗?
- 6、什么是左前缀原则嘛?
- 7、什么是覆盖索引?
- 8、简述MyISAM和InnoDB的区别?
- 9、B+tree 与 B-tree区别
- 3、调优
- 1、MySQL 如何定位慢查询?
- 2、如何处理慢查询?
- 3、数据库分表操作
- 4、Sql优化经验
- 4、锁
- 1、锁的分类?
- 2、悲观锁和乐观锁的怎么实现?
- 3、说一下 MySQL 的行锁和表锁?
- 4、解释一下MVCC?
- 5、间隙锁
- 5、你们公司有哪些数据库设计规范
- Redis
- 数据类型
- 1、介绍下Redis?Redis有哪些数据类型?
- 持久化
- 1、Redis提供了哪几种持久化方式?
- 分布式锁
- 1、什么是分布式锁?
- 2、分布式锁应该满足哪些条件?
- 3、分布式锁的实现方案?
- 4、setnx的缺点
- 主从和集群
- 使用问题
- 1、使用Redis作为缓存,Redis数据和MySQL数据库的一致性如何实现?
- 2、缓存穿透,缓存击穿,缓存雪崩的原因和解决方案?
- 使用场景
- 1、redis的适用场景
- 其他
- 1、Redis为什么快?
- 2、Redis为什么是单线程的?
- 3、Redis真的是单线程吗?
- 4、为什么Redis的操作是原子性的,怎么保证原子性的?
- 5、MySQL里有大量数据,如何保证Redis中的数据都是热点数据?(Redis内存淘汰策略)
- 6、redis过期策略
- RabbitMQ
- 1、你们项目中哪里用到了RabbitMQ ?
- 2、为什么会选择使用RabbitMQ ? 有什么好处 ?
- 3、使用RabbitMQ如何保证消息不丢失 ?
- 4、消息的重复消费问题如何解决的 ?
- 5、RabbitMQ如何保证消费的顺序性 ?
- 6、RabbitMQ的延迟队列有了解过嘛 ?
- 多线程
- 线程基础知识
- 1、进程和线程
- 2、并发和并行
- 3、线程的创建方式
- 4、线程的状态转换有什么?(生命周期)
- 5、sleep和wait在线程里有什么区别?
- 6、notify()和notifyAll()有什么区别?
- 7、Thread 类中的start() 和 run() 方法有什么区别?
- 8、怎么理解线程安全?
- 9、如何中断一个线程?
- 并发锁
- 1、讲一下synchronized关键字的底层原理?
- 2、CAS 你知道吗?
- 3、什么是AQS?
- 4、ReentrantLock的实现原理
- 5、synchronized和Lock有什么区别 ?
- 7、锁的分类?
- 6、什么是死锁?怎么解决?怎么避免?
- 7、请谈谈你对 volatile 的理解?
- 8、那你能聊一下ConcurrentHashMap的原理吗?
- 9、怎么保证多线程的执行安全
- 10、常见线程安全的并发容器有哪些?
- 线程池
- 1、谈谈你对线程池的理解?
- 2、线程的核心参数
- 3、线程池的种类?
- 4、线程池工作原理?
- 5、为什么不建议使用Executors创建线程池呢?
- 6、线程池的拒绝策略
- 7、谈谈你对ThreadLocal的理解?
- 8、线程池如何知道一个线程的任务已经执行完成?
- JVM
- 1、JVM组成
- 1、 说一下 JVM 的主要组成部分?及其作用?
- 2、你能详细说一下 JVM 运行时数据区吗?
- 3、详细的介绍Java堆吗?
- 4、堆和栈的区别是什么?
- 2、垃圾回收
- 1、GC是什么?为什么要GC?
- 2、Java中垃圾收集的方法有哪些?
- 3、 说一下 JVM 有哪些垃圾回收器
- 4、简述java回收策略以及Minor GC和Major GC(full GC)
- 5、Java 中都有哪些引用类型?
- 6、如何判断一个对象是否存活?(或者GC对象的判定方法)
- 6、StackOverflowError(栈溢出)和OutOfMemoryError(堆溢出)常见原因?怎么排查?
- 3、类加载
- 1、Java类加载过程?
- 2、什么是类加载器,类加载器有哪些?
- 3、简述双亲委派机制
- 4、调优
- 1、说一下 JVM 调优的工具
- 2、常用的 JVM 调优的参数都有哪些?
- 3、服务器CPU持续飙高,你的排查方案与思路?
- 设计模式
- 1、单例模式
- 2、工厂模式
- 3、代理模式
- 场景题
- 1、为什么要保证接口幂等性?
- 2、上传数据的安全性你们怎么控制?
- 3、权限认证是如何实现的?
- 4、你遇到过哪些问题?
- 5、生产环境遇到问题怎么排查?
- 6、怎么去查看日志?
- 7、怎么解决内存溢出?
- 8、跨域问题?
- 9、CPU飙高怎么处理?
- 10、开发流程
- 11、服务正在发布,怎么不影响用户使用?
Java基础
1、JDK 和 JRE 有什么区别?
JDK(Java Development Kit),Java开发工具包
JRE(Java Runtime Environment),Java运行环境
JDK中包含JRE,JDK中有一个名为jre的目录,里面包含两个文件夹bin和lib,bin就是JVM,lib就是JVM工作所需要的类库。
2、== 和 equals 的区别是什么?
1、对于基本类型,比较的是值;
2、对于引用类型,比较的是地址;
3、equals不能用于基本类型的比较;
4、如果没有重写equals,equals就相当于==;
5、如果重写了equals方法,equals比较的是对象的内容;
3、final 在 java 中有什么作用?
(1)用来修饰一个引用
如果引用为基本数据类型,则该引用为常量,该值无法修改;
如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
如果引用时类的成员变量,则必须当场赋值,否则编译会报错。
(2)用来修饰一个方法
当使用final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。
(3)用来修饰类
当用final修改类时,该类成为最终类,无法被继承。比如常用的String类就是最终类。
4、java 中的 Math.round(-11.3) 等于多少?
-11
Math提供了三个与取整有关的方法:ceil、floor、round
(1)ceil:向上取整;
Math.ceil(11.3) = 12;
Math.ceil(-11.3) = -11;
(2)floor:向下取整;
Math.floor(11.3) = 11;
Math.floor(-11.3) = -12;
(3)round:四舍五入;加0.5然后向下取整。
Math.round(11.3) = 11;
Math.round(11.8) = 12;
Math.round(-11.3) = -11;
Math.round(-11.8) = -12;
5、String str="i"与 String str=new String(“i”)一样吗?
两个语句都会先去字符串常量池中检查是否已经存在 “xyz”,如果有则直接使用,如果没有则会在常量池中创建 “xyz” 对象。
另外,String s = new String(“xyz”) 还会通过 new String() 在堆里创建一个内容与 “xyz” 相同的对象实例。
所以前者其实理解为被后者的所包含。
6、new String(“a”) + new String(“b”) 会创建几个对象?
如果字符串常量池中没有“a”和“b”,就是6个,否则就是4个
对象1:new StringBuilder()
对象2:new String(“a”)
对象3:常量池中的"a"
对象4:new String(“b”)
对象5:常量池中的"b"
深入剖析:StringBuilder中的toString():
对象6:new String(“ab”)
强调一下,toString()的调用,在字符串常量池中,没有生成"ab"
字符串常量池: JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。
7、如何将字符串反转?
将对象封装到stringBuilder中,调用reverse方法反转。
8、String 类的常用方法都有那些?
(1)常见String类的获取功能
length:获取字符串长度;
charAt(int index):获取指定索引位置的字符;
indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引;
substring(int start):从指定位置开始截取字符串,默认到末尾;
substring(int start,int end):从指定位置开始到指定位置结束截取字符串;
(2)常见String类的判断功能
equals(Object obj): 比较字符串的内容是否相同,区分大小写;
contains(String str): 判断字符串中是否包含传递进来的字符串;
startsWith(String str): 判断字符串是否以传递进来的字符串开头;
endsWith(String str): 判断字符串是否以传递进来的字符串结尾;
isEmpty(): 判断字符串的内容是否为空串"";
(3)常见String类的转换功能
byte[] getBytes(): 把字符串转换为字节数组;
char[] toCharArray(): 把字符串转换为字符数组;
String valueOf(char[] chs): 把字符数组转成字符串。valueOf可以将任意类型转为字符串;
toLowerCase(): 把字符串转成小写;
toUpperCase(): 把字符串转成大写;
concat(String str): 把字符串拼接;
(4)常见String类的其他常用功能
replace(char old,char new) 将指定字符进行互换
replace(String old,String new) 将指定字符串进行互换
trim() 去除两端空格
int compareTo(String str) 会对照ASCII 码表 从第一个字母进行减法运算 返回的就是这个减法的结果,如果前面几个字母一样会根据两个字符串的长度进行减法运算返回的就是这个减法的结果,如果连个字符串一摸一样 返回的就是0。
9、String、String buffer和String builder区别?
String字符串对象是不可变对象,虽然可以共享常量对象,但是对于频繁字符串的修改和拼接操作,效率极低
后面两者都是可变字符串对象
StringBuffer:线程安全的(因为它的方法有synchronized修饰)效率低
StringBuilder:线程不安全的 性能高
小结:
(1)如果要操作少量的数据用 String;
(2)多线程操作字符串缓冲区下操作大量数据用 StringBuffer;
(3)单线程操作字符串缓冲区下操作大量数据用 StringBuilder。
String不可变的真正原因?
1、字符串的本质是char数组(jdk9以后是byte[]),被 final 修饰且为私有的,并且String 类没有提供/暴露修改这个字符串的方法。
2、String 类被 final 修饰导致其不能被继承,进而避免了子类破坏 String 不可变。
10、 字符串拼接问题
(1)常量+常量:结果是常量池(常量优化,因为编译期间就可以确定结果)
(2)常量与变量 或 变量与变量:结果是堆
(3)拼接后调用intern方法:结果在常量池
11、什么是自动拆装箱? int和Integer有什么区别?以及以下程序运行结果。
基本数据类型,如int,float,double,boolean,char,byte,不具备对象的特征,不能调用方法。
装箱:将基本类型转换成包装类对象
拆箱:将包装类对象转换成基本类型的值
java为什么要引入自动装箱和拆箱的功能?主要是用于java集合中,List list=new ArrayList();
list集合如果要放整数的话,只能放对象,不能放基本类型,因此需要将整数自动装箱成对象。
实现原理:javac编译器的语法糖,底层是通过Integer.valueOf()和Integer.intValue()方法实现。
区别:
(1)Integer是int的包装类,int则是java的一种基本数据类型
(2)Integer变量必须实例化后才能使用,而int变量不需要
(3)Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
(4)Integer的默认值是null,int的默认值是0
包装类型的缓存机制
Java 基本数据类型的包装类型的大部分都用到了缓存机制来提升性能。
Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。
如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。
两种浮点数类型的包装类 Float,Double 并没有实现缓存机制。
1. public class Test01 { 2. public static void main(String[] args){ 3. Integer a = 127; 4. Integer b = 127; 5. Integer c = 128; 6. Integer d = 128; 7. System.out.println(a==b); //true 8. System.out.println(c==d); //false Float i11 = 333f; Float i22 = 333f; System.out.println(i11 == i22);// 输出 false Double i3 = 1.2; Double i4 = 1.2; System.out.println(i3 == i4);// 输出 false 9. } 10.}
建议:所有整型包装类对象之间值的比较,建议使用 equals 方法比较。
12、类和对象的关系
类是对同一类事物的描述,是抽象的
对象是一类事物的实现,是具体的
类是模板,对象是类的实例
13、怎么理解面向对象?
继承:描述的是事物之间的所属关系,is-a,子类继承父类的特征和行为,复用性 扩展性
封装:内部属性私有化,对外提供公共的访问方式,高内聚,低耦合
多态:同一个行为有不同的表现形式,多态存在3个条件:①继承②重写③父类引用指向子类对象 如List list = new ArrayList();
14、接口与抽象类的区别?
1、成员变量 抽象类:既可以是常量也可以是变量 接口:一定是常量 2、构造 抽象类:有构造 接口:没有构造 3、成员方法 抽象类:既可以是普通方法,也可以是抽象方法 接口:JDK1.8之前,必须是抽象方法(JDK8之后出现了默认方法和静态方法,JDK9出现了私有方法) 4、设计理念 抽象类:作为一个继承体系顶层,将共性行为和属性被继承下去,体现is-a的关系 单继承 接口:作为一个功能进行扩展 多实现(子类可以实现多个接口)
15、重载与重写有什么区别?
1、重载发生在本类,重写发生在父类与子类之间;
2、重载的方法名必须相同,重写的方法名相同且返回值类型必须相同;
3、重载的参数列表不同,重写的参数列表必须相同。
4、重写的访问权限不能比父类中被重写的方法的访问权限更低。
5、构造方法不能被重写
16、为什么要使用克隆?如何实现对象克隆?深拷贝和浅拷贝区别是什么?
(1)什么要使用克隆?
想对一个对象进行复制,又想保留原有的对象进行接下来的操作,这个时候就需要克隆了。
(2)如何实现对象克隆?
实现Cloneable接口,重写clone方法;
实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深克隆。
BeanUtils,apache和Spring都提供了bean工具,只是这都是浅克隆。
(3)深拷贝和浅拷贝区别是什么?
浅拷贝:仅仅克隆基本类型变量,不克隆引用类型变量;
深拷贝:既克隆基本类型变量,又克隆引用类型变量;
17、java 中 IO 流分为几种?
所谓的IO就是实现数据从磁盘的读取和写入。
实际上,除了磁盘以外,内存、网络都可以作为 I/O 流的数据来源和目的地。
在 Java 里面,提供了字符流和字节流两种方式来实现数据流的操作。
Java 里面提供了 Socket的方式来实现数据的网络传输。
18、 常见的IO模型:BIO、NIO、AIO
BIO
定义:同步阻塞IO,传统的IO模型,实现数据从磁盘中的读取以及写入。
特点:简单使用方便,但并发处理能力低。
NIO
定义:同步非阻塞 IO,是传统 IO 的升级,它是支持面向缓冲的,基于通道的 I/O 操作方法。了特点:多路复用,减少CPU的小号,适用于高并发。
AIO
定义:异步非阻塞IO,是 NIO 的升级,也叫 NIO2,异步 IO 的操作基于事件和回调机制。
特点:异步非阻塞
19、什么是 java 序列化?怎么实现序列化
序列化:把内存中的java对象转换为二进制字节流,用来实现存储或传输
反序列化:将从文件或者网络上获取到的对象的字节流转化为对象
序 列 化 的 实 现 :
只有实现了Serializable和Externalizeble的接口的类才能实现序列化。
Java.IO.ObjectOutputStream代表对象输出流。writeObject(Object obj)方法可对参数指定的obj对象进行序列化。
Java.IO.ObjectInputStream代表对象输入流,它的readObject()方法可以反序列化。
如果类中每个成员变量不想被序列化,可以用transient关键字修饰。
20、final、finally、finalize的区别?
final:修饰符(关键字)有三种用法:修饰类、变量和方法。修饰类时,意味着它不能再派生出新的子类,即不能被继承,因此它和abstract是反义词。修饰变量时,该变量使用中不被改变,必须在声明时给定初值,在引用中只能读取不可修改,即为常量。修饰方法时,也同样只能使用,不能在子类中被重写。
finally:通常放在try…catch的后面构造最终执行代码块,这就意味着程序无论正常执行还是发生异常,这里的代码只要JVM不关闭都能执行,可以将释放外部资源的代码写在finally块中。
finalize:Object类中定义的方法,Java中允许使用finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在销毁对象时调用的,通过重写finalize() 方法可以整理系统资源或者执行其他清理工作。
21、Object中有哪些方法?
(1)protected Object clone()--->创建并返回此对象的一个副本。 (2)boolean equals(Object obj)--->指示某个其他对象是否与此对象“相等”。 (3)protected void finalize()--->当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 (4)Class
还没有评论,来说两句吧...