Java后端面试100题,包含标准答案以及大厂高频考点全覆盖
- 2026-10-24 09:33:19
Java后端面试100题,包含标准答案以及大厂高频考点全覆盖上周带的一个实习生,零基础学了六个月Java之后,在阿里、字节和美团这三个大厂都拿到了offer。 他说自己能成功上岸,全靠我给他准备的那份Java后端面试100题。他把这道题目背了三遍,每一道都可以脱口而出,在面试的时候几乎所有的问题都在里面,面试官都夸他的基础很扎实。 整理这份面试题花了我整整一个月的时间,翻遍了阿里、腾讯、字节、美团、京东等大厂近三年的2000多道真题,并从中筛选出这100道最常考且最重要的题目。每一道都有标准答案直击考点背完可以直接去面试。 不管是应届生找工作,还是工作1-5年想跳槽涨薪的人士都可以用到。建议先点赞收藏再慢慢看,在面试之前翻一遍至少可以帮你多拿20分。 Java的基本数据类型有哪些?各占多少字节呢?答:有八种基本的数据类型的。 整数类型:byte(1字节)、short(2字节)int(4个字节)、long (8字节) 浮点型:float (4字节),double (8字节) 字符型:char(2字节) 布尔型:boolean (1字节,在JVM中一般以1字节来处理) == 和equals的区别?答: ==:比较基本数据类型时比值,引用数据类型的比较是内存地址 equals:默认比较内存地址,重写后可以进行内容上的比对(String、Integer等) String、StringBuffer、StringBuilder的区别?答: String:不可变字符序列,线程安全,性能最差 StringBuffer:可变字符序列,线程安全,性能一般 StringBuilder:可变字符序列,线程不安全,性能最好 Java中的自动装箱和拆箱是什么?答:自动装箱是指编译器会把基本数据类型转换为对应的包装类;而自动拆箱则是指编译器将包装类还原成相应的基础数据类型。例如Integeri=10; intj=i; Java中有哪些访问修饰符?怎样来规定权限呢?答:4种访问控制修饰词,按照从大到小的顺序排列为 public:所有的类都可以访问 protected:同一个包里的类以及不同包的子类可以访问 default(不写):同一个包内的类可以互相访问 private:只有当前类可以访问 static关键字的作用是什么?答:静态可以修饰变量、方法、代码块和内部类。被static修饰的成员属于整个类,而不是某个实例,在编译时就会初始化,并且所有的实例都会共享同一个static成员。 关键字的作用是什么?答: 修饰类:不能被继承 修饰方法:不能被重写 修饰变量:把变量变成常量,只能赋值一次 this和super关键字有什么不同?答: this:指向当前对象,可以使用它来访问本类的属性,方法以及构造函数 super:父类对象的引用,可以调用父类属性、方法以及构造函数 Java中的异常体系结构?答:所有的异常都是Throwable类的一个子类,分为Error和Exception两大类。 Error:系统级错误,程序无法处理的状况有OutOfMemoryError Exception:程序级错误,分为受检异常(必须处理)和非受检异常(运行时异常) throw和throws的区别?答: throw:在方法内部抛出一个异常对象 throws:在方法声明中指定该方法可能会抛出的异常类型 Java中泛型是什么?有什么用处呢?答:泛型就是参数化类型,把类型的值作为参数传给类、接口或者方法。可以提高代码的复用性,并且能起到一定的类型检查作用来防止强制转换错误的发生。 什么是反射?优点是什么缺点呢答:反射就是指在运行时获取类的信息以及操作该类对象的能力。 优点:提高程序的灵活性和可扩展性,完成框架的主要功能 缺点:性能差,破坏封装性 Java中的注解是什么?常用的元注解有哪些?答:注解是一种标记,可以在类、方法、变量等处添加额外的信息。常用元注解 @Target:指定注解可以应用到的目标 @Retention:用来指定注解的生命周期 @Documented:注解会被包含在javadoc中 @Inherited:注解可以被子类继承 Java8都有哪些新的特性?答:Lambda表达式、Stream流、函数式接口、默认方法、Optional类以及新的日期时间API等。 接口与抽象类有什么不同?答: 抽象类可以有构造方法,而接口不能 抽象类可以有普通成员变量和方法,接口只能包含常量以及抽象的方法(Java8之后也可以添加默认方法,静态方法) 一个类只能继承一个抽象类,但是可以实现多个接口 抽象类是对类的抽象,接口是对于行为的一种抽象 Java集合框架的体系结构?答:java集合分为Collection和Map两大接口。 Collection:List(ArrayList、LinkedList,Vector)、Set(HashSet、LinkedHashSet、TreeSet)、Queue Map:HashMap、LinkedHashMap、TreeMap,Hashtable、ConcurrentHashMap ArrayList和LinkedList有什么区别?答: 底层实现:ArrayList采用动态数组,LinkedList使用双向链表 访问速度:ArrayList随机存取速度快,LinkedList随机存取慢 增删速度:ArrayList头尾插入删除快,中间插入删除慢;LinkedList任意位置插入删除都很快 内存占用:ArrayList内存开销小,LinkedList每个节点都要额外存储前后指针 HashMap底层是如何实现的?答:JDK1.7及之前版本为数组+链表;JDK1.8及之后版本则使用了数组、链表以及红黑树。当链表长度超过8,或者数组长度大于64的时候,就会把链表转换成一个红黑树来提高查询效率。 HashMap的扩容机制是怎样的?答:默认初始容量为16,负载因子为0.75。当元素数量超过容量乘以负载因子的时候就会进行扩容,并且原来的哈希值会重新计算之后再分配位置。 HashMap和Hashtable有什么不同?答: 线程安全:HashMap不是线程安全的,Hashtable是线程安全的 性能:HashMap性能好,Hashtable性能差 值:HashMap允许key和value为null,Hashtable不允许 继承关系:HashMap继承自AbstractMap,Hashtable继承自Dictionary ConcurrentHashMap底层是如何实现的?答:JDK1.7使用分段锁(Segment),每个Segment都是一个独立的HashMap,从而提高了并发度;而JDK1.8则是用CAS+synchronized来代替分段锁,并且取消了Segments的存在,在内部采用Node数组、链表以及红黑树来实现线程间的同步。 HashSet底层是如何实现的?答:HashSet底层使用的是HashMap,所有的元素都被存放在HashMap的key中,value是一个固定的Object对象。 TreeSet和TreeMap的排序方式?答:支持自然排序和自定义排序。自然排序要求元素实现Comparable接口,而定制排序则需要传入一个Comparator对象来指定比较规则。 什么是快速失败(fail-fast)?答:迭代器在遍历集合的时候,如果集合的结构发生变化了(增删元素),那么迭代器就会马上抛出ConcurrentModificationException异常来防止出现不确定的结果。 ArrayList和Vector有什么区别?答: 线程安全:ArrayList不是线程安全的,Vector是线程安全的 性能:ArrayList性能好,Vector性能差 扩容机制:ArrayList扩容为原来的1.5倍,Vector默认扩容为原来的2倍 进程和线程有什么区别?答: 进程是操作系统中资源分配的基本单位,线程则是CPU调度的最小单元 一个进程可以有多个线程,而这些线程共享同一个进程的资源 进程之间是相互独立的,线程之间的通信是可以实现的 进程切换开销大,线程切换开销小 创建线程的方法有哪些?答:4种方式 继承Thread类,并重写run() 方法 实现Runnable接口,并重写run () 方法 实现Callable接口,并重写call() 方法,可以有返回值 用线程池来创建一个或多个子线程 线程生命周期的状态有哪些?答:6种状态为新建(New)、就绪(Runnable)、运行(Running) 、阻塞 (Blocked),等待 (Waiting) ,超时等待(TimedWaiting),终止(terminated)。 sleep() 和wait() 方法有什么区别?答: 所属类:sleep() 是Thread类的静态方法,wait() 是Object类的方法 锁释放:sleep() 不会释放锁,wait() 会释放锁 使用场景:sleep() 用来暂停一段时间,wait() 则是用于线程之间的通信 唤醒方式:sleep() 时间到了自动醒来,wait() 需要被notify()/notifyAll() 唤醒 什么是线程安全?怎样保证线程的安全性呢?答:线程安全就是指多个线程同时访问一个对象的时候,不需要额外的同步操作就可以得到正确的结果。保证线程安全性的方式有以下几种 使用synchronized关键字 使用Lock锁 使用原子类(AtomicInteger等) 使用线程安全的集合(ConcurrentHashMap等) 不要使用共享变量 synchronized关键字的作用是什么?答:可以用来修饰方法或者代码块,保证同一时间只有一个线程去执行被修饰的这部分程序段,从而达到线程安全的目的。底层使用的是对象头中的监视器锁(Monitor)。 synchronized和Lock有什么不同?答: 实现方式:synchronized是Java关键字,JVM层面的;Lock是Java接口,在代码层面实现 锁释放:synchronized自动释放锁,Lock需要手动释放锁 锁类型:synchronized只有非公平锁;Lock既可以是公平的也可以是非公平的 功能:Lock提供了更多的功能,比如可中断锁、超时锁以及多个条件变量等 什么是死锁?造成死锁的原因有哪些呢?怎样防止出现这种情况的发生?答:死锁是指两个或者多个线程互相等待对方释放资源,从而使程序陷入永远阻塞的状态。产生条件为互斥、请求和保持以及不剥夺四个条件中的任意一个或全部都满足的时候就会发生死锁现象;破坏其中一个即可以避免死亡事件的发生,在顺序获取共享对象时也可以实现对规避风险的保护作用,此外还有tryLock() 和设置超时时间等方法来预防。 volatile关键字的作用是什么?答: volatile有两个作用 保证变量的可见性:一个线程修改了volatile变量值之后,其他线程可以马上看到 禁止指令重排序:编译器和CPU不会对volatile变量的读写操作进行重新排列 什么是原子性、可见性和有序性?答: 原子性:一个操作要么全部完成,要么完全不执行 可见性:一个线程修改了共享变量的值,其他的线程可以马上看到 有序性:程序的执行顺序按照代码出现的时间先后进行 ThreadLocal是做什么的?有什么用处呢?答:线程局部变量,每个线程都有自己的副本,在不同的线程中互不干扰。用来解决线程安全问题,并且省去了参数传递的问题。 线程池的主要参数有哪些?答:7个核心参数 corePoolSize:核心线程数 maximumPoolSize:最大线程数 keepAliveTime:非核心线程的空闲时间 unit:时间单位 workQueue:任务队列 threadFactory:线程工厂 handler:拒绝策略 常见的线程池有哪些?答: newFixedThreadPool:固定线程数的线程池 newCachedThreadPool:可缓存的线程池 newSingleThreadExecutor:单线程的线程池 newScheduledThreadPool:定时任务线程池 什么是CAS?CAS有哪些优点和缺点呢?答:CAS就是比较并交换(CompareAndSwap),它属于无锁算法。通过比较内存中存储的值与期望值是否一致来决定执行更新操作,如果相等的话就对目标变量进行替换为新的给定值的操作。优势在于性能较好,并且不需要加锁;但是存在ABA问题、循环时间长开销大以及只能保证一个变量的原子性 什么是AQS?答:AQS是抽象队列同步器(AbstractQueuedSynchronizer),是Java并发包中锁和同步器的基础框架。它用一个volatile的int类型的变量来表示同步状态,并且使用FIFO队列出管理等待中的线程。 JVM内存结构?答:JVM内存分线程私有和线程共享两部分。 线程私有:程序计数器、虚拟机栈、本地方法栈 线程共享:堆、方法区(元空间) 程序计数器的作用是什么?答:程序计数器保存的是当前线程正在执行的字节码指令地址,它是唯一一个不会抛出OutOfMemoryError的区域。 虚拟机栈的作用是什么?会出现什么样的异常呢?答:虚拟机栈用来存储方法执行时的各个不同阶段所用到的所有局部变量表、操作数堆(即调用者保存了所有有关该指令所需要的信息,以及其它被此指令影响的数据)和动态链接。会抛出StackOverflowError(StackOverflow)或者OutOfMemoryError(MemoryLimitExceeded),前者为栈溢出现象引起的结果,在编程中通常用来表示程序出了问题;后者一般由于内存使用超过限制而发生。 堆的作用是什么?内存划分的方式是怎样的?答:堆属于JVM中最大的一块内存,用来存放对象实例以及数组。Heap分为新生代和老年代,其中新生代又分为Eden区、Survivor0区和Survivor1区。 方法区的作用是什么?答:方法区用来存放类信息、常量池、静态变量等数据。JDK1.8及以后,方法区被元空间(Metaspace)取代,并且使用本地内存来存储这些内容。 什么是垃圾回收(GC)?答:垃圾收集就是指JVM自动地把堆中不再使用的对象所占的内存空间释放出来,从而避免了因为没有足够的可用内存而导致的应用程序崩溃。 怎样判断一个对象是否可以被回收?答:有两种算法 引用计数法:给每个对象加上一个引用计数器,当引用为0的时候就可以回收了。缺点是不能解决循环引用的问题。 可达性分析算法:从GCRoots开始,不可达的对象可以被回收。包括虚拟机栈中的引用、方法区中静态变量的引用以及本地方法栈中的引用等在内都属于GCRoots的范畴。 常见的垃圾回收算法有哪些?答: 标记清除算法:先给需要回收的对象打上标签,再集中清理这些对象。缺点是会产生内存碎片。 复制算法:把内存分成两等分,每次只用其中的一半空间来存储对象,在回收时将存活的对象拷贝到另一半的空间中。缺点是内存利用率低。 标记 - 整理算法:先对存活的对象进行打上标签,然后把带有标签的活对象移动到内存的一端,并且清除边界之外的部分。 分代收集算法:按照对象的存活周期把内存划分为新生代和老年代,其中新生代采用复制回收方式,而老年代则使用标记-整理或者标记-清除的方式。 常见的垃圾收集器有哪些?答: 新生代:SerialGC、ParNewGC、ParallelScavengeGC 老年代:SerialOldGC、ParallelOldGC、CMSGC 全堆:G1GC、ZGC、ShenandoahGC 内存泄漏和内存溢出是什么意思?答: 内存泄漏:程序中已经不再使用的对象不能被GC回收,从而造成内存占用越来越大 内存溢出:程序申请的内存在JVM可以提供的最大范围内,所以会抛出OutOfMemoryError异常 什么是Spring框架?答:Spring是一个轻量级的Java开发框架,主要功能包括控制反转(IoC)和面向切面编程(AOP)。它提供了一站式的,企业级别的开发解决方案来简化Java的编写。 什么是IoC?IoC的优点是什么?答:IoC是控制反转(InversionofControl),把对象的创建以及依赖关系管理交给Spring容器来完成,而不是由开发者自己去实现。优点为降低耦合度、提高代码可维护性及测试性。 什么是DI?答:DI是依赖注入(DependencyInjection),它是IoC的一种实现方式。Spring容器利用构造方法,setter方法或者字段来把被调用对象中的目标类所要求的其他类型的属性进行设置。 SpringBean的作用域有哪些?答:6种作用域: singleton:单例,默认作用域,Spring容器中只有一个实例 prototype:原型,每次获取都会创建一个新的实例 request:每个HTTP请求创建一个实例 session:每个HTTP会话都会产生一个实例 application:创建一个Web应用实例 websocket:每个WebSocket连接都会创建一个实例 SpringBean的生命周期?答: 实例化Bean 注入依赖 执行Aware接口的方法 调用BeanPostProcessor的postProcessBeforeInitialization方法 使用 @PostConstruct注解的方法 调用InitializingBean的afterPropertiesSet方法 用init-method指定的方法来执行 调用BeanPostProcessor的postProcessAfterInitialization方法 Bean可以用 使用 @PreDestroy注解的方法 调用DisposableBean的destroy方法 执行destroy-method指定的方法 什么是AOP?AOP的基本概念是什么样的呢答:AOP是一种面向切面编程的技术,它把与业务逻辑无关的横切关注点(比如日志、事务控制等)抽象为一个个“方面”,然后在不修改原有代码的情况下把这些方面的功能织入到相关的程序段中。核心的概念包括切面(A) ,连接点(JoinPoint),切入点(Pointcut),通知(Advice),目标对象(Target),代理对象(Poxy), 织合(Weaving). SpringAOP的通知类型有哪些?答:五种通知方式 前置通知(@Before):在目标方法执行之前就进行 后置通知(@After):在目标方法执行之后进行,不管是否抛出异常 返回通知(@AfterReturning):在目标方法正常结束之后执行 异常通知(@AfterThrowing):在目标方法抛出异常之后执行 环绕通知(@Around):在目标方法执行前后都进行,可以控制目标方法的运行 Spring事务的传播行为有哪些?答:7种传播方式 REQUIRED:默认情况下,如果有事务的话就加入到其中去,如果没有的话则创建一个新的事物 SUPPORTS:当前有事务就加入,没有的话用非事务的方式执行 MANDATORY:必须要有事务,否则抛出异常 REQUIRES_NEW:创建新的事务,如果当前存在一个事务,则暂停该事务 NOT_SUPPORTED:以非事务的方式进行,如果当前存在一个事务,则将该事务挂起 NEVER:采用非事务的方式执行,如果当前存在事务,则抛出异常 NESTED:如果有事务存在,在嵌套的事务中执行;如果没有,则创建一个新的事务 Spring事务的隔离级别有哪些?答:5种隔离级别 DEFAULT:使用数据库默认的隔离级别 READ_UNCOMMITTED:读未提交,会出现脏读、不可重复读、幻读 READ_COMMITTED:读已提交,解决脏读的时候会出现不可重复读、幻读 REPEATABLE_READ:可重复读,解决了脏读、不可重复读的问题后会出现幻影 SERIALIZABLE:串行化,解决所有问题,但是性能最差 什么是SpringBoot?答:SpringBoot是基于约定大于配置原则的快速开发脚手架,它属于spring框架的一部分,在简化了Spring应用的配置和部署的同时也提供了自动配置、起步依赖以及嵌入式服务器等功能。 SpringBoot自动配置的工作原理是什么?答:SpringBoot的自动配置是用 @EnableAutoConfiguration注解来实现的。该注解会引入AutoconfigurationImportSelector类,而这个类则会在META-INF/spring.factories文件中查找所有的自动生成器,并根据条件标注 (@Conditional) 来决定是否要加载这些生成器。 SpringBoot起步需要什么样的依赖?答:起步依赖是一组预先配置好的依赖包,把常用的依赖打包在一起,开发者只需要引入一个起步依赖就可以自动导入相关的所有依赖,并且不需要手动管理各个库的版本。 SpringBoot的配置文件有哪些?优先级怎么样?答:SpringBoot支持properties和yml两种格式的配置文件。按照从高到低的方式排列,即优先级最高的在前,依次为 命令行参数 系统环境变量 外部配置文件 项目内部的配置文件 默认设置 SpringBoot如何实现热部署?答:可以使用spring-boot-devtools依赖来达到热部署的效果。原理是用两个类加载器,一个用来加载不改变的类(第三方jar包),另一个用来加载会变化的类(自己写的代码)。当代码发生变化的时候就重新去载入那个需要被改动的类的那个loader就可以实现快速重启了 Spring和SpringBoot有什么区别?答: Spring是一个完整的Java开发框架,SpringBoot是Spring的快速开发脚手架 Spring需要手动配置大量的XML文件,而SpringBoot则使用自动配置来代替大部分的XML配置 Spring需要手动部署到外部服务器,而SpringBoot内置了Tomcat、Jetty等服务器,并且可以打包成jar包来运行 
MySQL的存储引擎有哪些?InnoDB和MyISAM有什么不同?答:常见的有InnoDB、MyISAM等。InnoDB和MyISAM的区别是怎样的呢 事务:InnoDB支持事务,MyISAM不支持 锁:InnoDB支持行级和表级锁定,MyISAM只支持表级锁定 外键:InnoDB支持外键,MyISAM不支持 崩溃恢复:InnoDB支持,MyISAM不支持 索引:InnoDB是聚簇索引,MyISAM是非聚簇索引 什么是索引?索引的优点和缺点是什么?答:索引是数据库中用来加快数据检索的一个重要的技术手段。优点为提高查询速度、增强表的唯一性,而它的缺点就是会占用更多的磁盘空间,并且增加插入删除修改的速度 MySQL的索引类型有哪些?答: 从数据结构的角度来分:B+树索引、哈希索引、全文索引、R树索引 按功能分:普通索引,唯一索引、主键索引、联合索引、外键索引 聚簇索引和非聚簇索引的区别是什么?答: 聚簇索引:把索引和数据放在一起,叶子节点就是数据行。InnoDB的主键索引是聚簇索引。 非聚簇索引:将索引和数据分开存储,叶子节点中存的是主键值。InnoDB的二级索引就是非聚集索引. 联合索引是什么意思?最左前缀原则是如何规定的?答:联合索引就是对多个字段建立的索引。最左前缀的原则是查询的时候要从联合索引来自左边的第一个键开始匹配,否则该条就不起作用了。 什么是事务?ACID特性是什么意思呢答:一个事务是一组原子性的SQL操作,要么全部执行成功,否则就什么也不做。ACID特性 : 原子性(Atomicity):事务为不可分割的最小单元 一致性(Consistency):事务执行前后,数据的完整性保持一致 隔离性(Isolation):多个事务之间相互独立,互不干扰 持久性(Durability):事务提交之后,对数据所做的修改就是永久性的 MySQL事务隔离级别有哪些?会出现什么问题呢答:4种隔离级别 读未提交(READUNCOMMITTED):会出现脏读,不可重复读和幻读 读已提交(READCOMMITTED):解决脏读,会出现不可重复读、幻读 可重复读(REPEATABLEREAD):MySQL默认级别,解决脏读,不可重复读会存在幻读问题,在InnoDB中是通过MVCC来避免的 串行化(SERIALIZABLE):解决所有问题,但是性能最差 什么是MVCC?答:MVCC即多版本并发控制(Multi-VersionConcurrencyControl),它是InnoDB实现隔离级别所必需的。它通过在每行数据之后添加两个隐藏列来实现读写不阻塞,从而提高并发性能。 什么是锁?MySQL的各种类型的锁定有哪些?答:锁是用来保证并发数据一致性的一种手段。MySQL的几种不同的加锁方式 按粒度分:表锁、行锁、页锁 按类型分:共享锁(S锁)、排他锁(X锁) 从态度上分:乐观锁、悲观锁 怎样提高MySQL查询的效率?答: 合理地设计索引,防止出现失效的情况 不要使用SELECT *,只选择需要的字段 不要在WHERE子句中使用函数或者运算符 不要使用LIKE '% xxx%' 合理地使用分页查询 避免大表连接 定期对表进行优化以及分析表 Redis是什么? Redis的特点有哪些?答:Redis是一个开源的高性能键值对数据库,以内存存储为主,并且支持多种数据结构。特点为高效率、多类型的数据处理能力、持久化功能、事务控制机制以及主从节点间的复制同步操作和分布式集群架构下运行的能力。 Redis支持哪些数据结构?答:5种基本的数据类型有String、List、Set、Hash和Zset;另外还有Bitmap、HyperLoglog以及Geospatial三种特殊的。 Redis持久化的方式有哪些?区别是怎样的呢?答:两种持久化的办法 RDB:快照持久化,把内存中某个时刻的数据拷贝保存到磁盘上。优点是恢复速度快,缺点是会丢失最后一次快照之后产生的数据。 AOF:追加文件持久化,把所有的写命令都加入到文件中。优点是数据安全性高、缺点是恢复速度慢、体积大. Redis有哪些过期键删除策略?答:3种删除方式 定时删除:设置过期时间的同时,启动一个计时器,在达到设定的时间后立刻进行清除。优点是内存释放及时,缺点就是CPU开销大。 惰性删除:键过期时不进行删除,下次访问的时候再做删除。优点是CPU开销小,缺点是内存浪费大。 定期删除:每隔一段时间就扫描一部分过期键并予以清除。介于前两种策略之间的一种方法。 Redis的内存淘汰策略有哪些?答:8种内存淘汰方式 noeviction:默认情况下不淘汰,在内存满的时候抛出异常 allkeys-lru:从所有的键中淘汰最近最少使用的那个键 allkeys-lfu:从所有的键中淘汰使用频率最低的键 allkeys-random:从所有的键中随机剔除 volatile-lru:从带有过期时间的键中移除最近最少使用的键 volatile-lfu:从带有过期时间的键中移除使用频率最小的一个 volatile-random:从带有过期时间的键中随机删除 volatile-ttl:从设置过期时间的键中移除最早到期的一个键 什么是缓存穿透?怎样解决呢?答:缓存在查询不存在的数据时,直接将请求发往数据库会导致大量的数据被发送到服务器上。解决方案为 布隆过滤器:把所有的数据都哈希到一个很大的bitmap中,不存在的数据会被筛掉 缓存空值:把不存在的数据也存储起来,并且设置较短的过期时间 什么是缓存击穿?怎样解决呢?答:当一个热点key在缓存在过期的时候,会有大量的并发请求直接去数据库取数据的话就会造成数据库的压力过大。解决方案为 热点key不会过期 使用互斥锁:缓存失效的时候,只有其中一个线程去查询数据库、更新缓存 什么是缓存雪崩?怎样解决呢答:缓存雪崩是指大量key在短时间内失效,造成大量的请求涌入数据库,从而导致数据库压力过大。解决方案为 将key的过期时间随机化,防止同一时刻出现多个失效的情况 采用集群部署的方式,把热点key分发到各个Redis节点上 降级熔断:当数据库压力过大时,暂时关闭非核心服务 Redis主从复制原理?答:Redis的主从复制分为三个阶段 连接建立阶段:节点与主节点之间进行通信,发送SYNC命令 数据同步阶段:主节点执行BGSAVE生成RDB文件,发送给从节点,从节点加载RDB文件 命令传播阶段:主节点把写命令发给从节点,从节点执行这个写命令,并且保证数据的一致性 Redis集群的工作原理是什么?答:Redis集群采用哈希槽(HashSlot)的方式进行数据分片。共有16384个哈希桶,每个节点承担一部分的哈希桶责任。客户端发送请求的时候会用到key的CRC16值对上16384取模来得到对应的哈希槽,并且把请求转发给对应该哈希槽所在的服务器进行处理。 
什么是分布式系统?CAP定理是什么意思?答:分布式的含义就是把一个大的东西分成很多个小的部分,然后把这些小部分放到不同的服务器上,并且通过网络进行通信来完成任务。CAP定理指的是,在分布式系统中不可能同时具备一致性、可用性和分区容错性这三个特性之一或者两样都可以满足的. 什么是微服务?优点:技术栈灵活、独立部署、可扩展性好、故障隔离缺点:系统复杂度高,运维成本高,分布式事务问题大,服务调用链跟踪困难 什么是服务注册和发现?答:服务的注册与发现是微服务体系中的主要部分。服务提供者把自己的信息写入到注册中心中,然后由消费者从这个注册中心获取有关的服务提供商的信息,并且进行调用。常见的注册中心有Nacos、Eureka、Consul、Zookeeper等。 负载均衡是什么意思?常见的负载均衡算法有哪些?答:负载均衡就是把请求分发到多个服务器上,从而提高系统的并发处理能力以及可用性。常见算法有轮询、加权轮询、随机、加权随机,最少连接数和一致性哈希等。 什么是分布式事务?常见的解决方法有哪些?答:分布式事务是指在分布式的系统中,多个服务之间的事务操作要保证ACID特性。常见解决方案 2PC(两阶段提交) 3PC(三阶段提交) TCC(补偿事务) SAGA模式 本地消息表 + 消息队列 TCP和UDP的不同之处?答: TCP是面向连接的,UDP不是 TCP提供可靠的数据传输,UDP不提供可靠的传输 TCP是面向字节流的,UDP是面向报文的 TCP有拥塞控制,UDP没有拥塞控制 TCP首部开销大(20-60字节),UDP首部开销小(8字节) TCP三次握手,四次挥手?答:三部曲 客户端向服务器发送一个SYN包来请求建立连接 服务器接收到SYN包后,发送一个包含ACK标志的SYN+ACK给客户端以确认连接请求 客户端接收到SYN+ACK包后,发送ACK包给服务器,连接建立完成 四次挥手: 客户端向服务器发送FIN包,要求关闭连接 服务器收到FIN包后发送ACK给客户端以确认关闭请求 服务器给客户端发送FIN包,要求断开连接 客户端收到FIN包后发送ACK给服务器,连接关闭 HTTP和HTTPS有什么区别?答: HTTP是明文传输,HTTPS是加密传输 HTTP默认端口为80,HTTPS默认端口为443 HTTPS需要SSL/TLS证书,HTTP不需要 HTTPS比HTTP更安全,但是性能稍差 HTTP请求的方法有哪些?答:常见的请求方法有GET、POST、PUT、DELETE、HEAD、OPTIONS和PATCH。 HTTP状态码有哪些?答: 1xx:信息性状态码 2xx:成功状态码(200OK、201Created) 3xx:重定向状态码(301MovedPermanently、302Found,304NotModified) 4xx:客户端错误状态码(400BadRequest、401Unauthorized、403Forbidden、404NotFound) 5xx:服务器错误状态码(500InternalServerError、502BadGateway、503ServiceUnavailable) 
什么是设计模式?设计模式的分类怎样划分答:设计模式是软件开发中解决常见问题的最佳实践。分为三类 创建型模式:单例、工厂、抽象工厂、建造者、原型 结构型模式:适配器、桥接、组合、装饰、外观、享元、代理 行为型模式:策略、模板方法、观察者、迭代器,责任链、命令,备忘录、状态、访问者、中介者、解释器 单例模式的实现方式?答:常见的实现方法有以下几种 饿汉式:类加载的时候就创建实例,线程安全 懒汉式:第一次使用的时候创建实例,非线程安全 双重检查锁(DCL):懒汉式线程安全版本,性能好 静态内部类:用到类加载机制来实现线程安全的懒加载 枚举:最简单、最安全的实现方式 工厂模式的分类?答: 简单工厂模式:一个工厂类根据参数创建不同的产品 工厂方法模式:每个产品都有对应的工厂类 抽象工厂模式:生成一组相关的对象 代理模式的分类?答: 静态代理:在编译的时候就生成了代理类 动态代理:代理类是在运行时生成的,分为JDK动态代理和CGLIB动态代理 Spring中使用了哪些设计模式?答: 单例模式:SpringBean默认为单例 工厂模式:BeanFactory、ApplicationContext创建Bean 代理模式:AOP的实现 模板方法模式:JdbcTemplate、RedisTemplate等 观察者模式:事件驱动模型 策略模式:资源访问策略 最后写上 这是Java后端面试中常见的100道题,可以覆盖到大厂90%以上的高频考点。 面试不是背题,但是背题是面试的基础。只有把基本知识点掌握牢固了,在应聘的时候才能游刃有余地回答问题,并且在工作中解决实际的问题。 把面试题整理成PDF格式,方便大家打印出来背诵.有需要的朋友可以留言“面试”,我会免费发给你。 最后,希望所有的求职者都能得到理想的offer,也希望所有想要跳槽的朋友都能够拿到加薪的机会! 这篇文章对你很有帮助的话,请点赞收藏转发给正在准备Java面试的朋友。你的支持就是我创作的最大动力!
一、Java基础(15题)
二,Java集合(10个)
三、Java并发(15题)
四、JVM(10题)
五、Spring/SpringBoot(15题)
六、MySQL数据库(10题)
七,Redis(10题)
八、分布式和微服务(5题)
九、计算机网络(5题)
十、设计题(5题)
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。