JAVA面试题大全(200+道题目)

📅 2026/7/24 1:42:38
JAVA面试题大全(200+道题目)
三、多线程1.并行和并发有什么区别并行是指两个或多个事件在同一时刻发生是在不同实体上的多个事件并发是指两个或多个事件在同一时间间隔发生是在同一个实体上的多个事件2.线程和进程的区别进程是资源分配最小单位线程是程序执行最小单位每个进程都有相应的线程进程有独立的地址空间线程没有线程是指处理机调度的基本单位进程执行开销大线程执行开销小3.守护线程是什么在java线程开发中有两种线程User Thread用户线程Daemon Thread守护线程普通用户进程在JVM退出时依然会继续执行导致JVM并不能退出普通进程可以使用setDaemon(true)方法升级为守护进程守护进程在JVM退出时会自动结束运行。守护线程拥有自动结束自己生命周期的特性而非守护线程不具备这个特点4.创建线程有哪几种方式继承Thread类并实现run方法调用继承类的start方法开启线程通过实现Runnable接口重写run方法调用线程对象的start方法开启线程除此之外还可以通过实现Callable接口实现call方法并用FutureTask类包装Callable对象开启线程。5.说一下 runnable 和 callable 有什么区别实现Callable接口的任务线程能返回执行结果而实现Runnable接口的任务线程并不能返回执行结果Callable接口的call方法允许抛出异常而Runnable接口的run方法的异常只能在内部消化不能继续上抛6.线程有哪些状态新建、就绪、运行、阻塞、死亡篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、场景题、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho7.sleep() 和 wait() 有什么区别sleep后程序不会释放同步锁wait后程序会释放同步锁sleep可以指定睡眠时间自动唤醒wait可以直接用notify唤醒sleep的类是Threadwait的类是Object8.notify()和 notifyAll()有什么区别notify()方法会唤醒对象等待池中的一个线程进入锁池notifyAll()方法会唤醒等待池中的所有线程进入锁池9.线程的 run()和 start()有什么区别调用start()方法是用来启动线程的轮到该线程执行时会自动调用run方法直接运行run方法无法达到启动多线程的目的相当于调用Thread对象中的run方法一个线程的start方法只能调用一次多次调用会抛出异常而run方法可以多次调用10.创建线程池有哪几种方式主要使用Excutors提供的通用线程池创建方法去创建不同配置的线程池newCachedThreadPool()特点用来处理大量短时间工作任务的线程池newFixedThreadPool(int nThreads)特点重用指定数目nThreads的线程newSingleThreadExecutor()特点工作线程数目限制为1newSingleThreadScheduledExecutor()和newScheduledThreadPool(int corePoolSize)可以进行周期或定时性的工作调度newWorkStealingPool(int parallelism)特点JDK8以后才加入11.线程池都有哪些状态RUNNING线程池被创建可以接收新线程SHUTDOWN线程池被关闭不接收新线程但是可以处理已有的线程。通过调用shutdown()方法STOP线程池停止不接受新线程中断当前的线程并且不会处理已有的线程。通过调用shutdownnow()方法TIDYING线程池等待当线程池处于SHUTDOWN或者STOP状态并且任务队列为空且执行中任务为空则会转变TERMINATED线程池彻底终止线程池在TIDYING状态中执行完terminated()方法后就会转变为此状态。12.线程池中 submit()和 execute()方法有什么区别execute() 参数 Runnable submit() 参数 (Runnable) 或 (Runnable 和 结果 T) 或 (Callable)execute() 没有返回值而 submit() 有返回值submit()的返回值Future调用get方法时可以捕获处理异常13.在 java 程序中怎么保证多线程的运行安全JDK Atomic开头的原子类、synchronized、LOCK可以解决原子性问题synchronized、volatile、LOCK可以解决可见性问题Happens-Before 规则可以解决有序性问题14.多线程锁的升级原理是什么锁的级别无锁 偏向锁 轻量级锁 重量级锁无锁没有对资源进行锁定所有线程都可以访问但是只有一个能修改成功其他的线程会不断尝试直至修改成功。偏向锁对象的代码一直被同一线程执行不存在多个线程竞争偏向锁指的就是偏向第一个加锁线程该线程不会主动释放偏向锁只有当其他线程尝试竞争偏向锁时才会被释放。偏向锁的撤销需要在某个时间点上没有字节码正在执行时先暂停拥有偏向锁的线程然后判断锁对象是否处于被锁定状态。如果线程不处于活动状态则将对象头设置成无锁状态并撤销偏向锁如果线程处于活动状态升级为轻量级锁的状态。轻量级锁轻量级锁是指当锁是偏向锁的时候被第二个线程 B 所访问此时偏向锁就会升级为轻量级锁线程 B 会通过自旋的形式尝试获取锁线程不会阻塞从而提高性能。当前只有一个等待线程则该线程将通过自旋进行等待。但是当自旋超过一定的次数时轻量级锁便会升级为重量级锁当一个线程已持有锁另一个线程在自旋而此时又有第三个线程来访时轻量级锁也会升级为重量级锁。重量级锁指当有一个线程获取锁之后其余所有等待获取该锁的线程都会处于阻塞状态。15.什么是死锁死锁是指两个或两个以上的进程在竞争资源的过程中造成的不可解堵塞。两个线程都在互相等待。16.怎么防止死锁预防资源一次性分配可剥夺资源资源有序分配超时放弃避免银行家算法检测为每个进程和每个资源建立唯一的ID建立资源分配表和进程等待表解除剥夺资源撤销进程17.ThreadLocal 是什么有哪些使用场景ThreadLocal是线程本地存储在每个线程中都创建了一个ThreadLocalMap对象每个线程可以访问自己内部ThreadLocal对象内的value。经典的使用场景是为每个线程分配一个JDBC连接的Connection这样就可以保证每个线程都在各自的Connection上进行数据库的操作不会出现A线程关了B线程的Connection还有Session管理等问题。18.说一下 synchronized 底层实现原理同步代码块是通过monitorenter和monitorexit指令获取线程的执行权同步方法是通过加ACC_SYNCHRONIZED 标识实现线程的执行权的控制19.synchronized 和 volatile 的区别是什么volatile本质是在告诉vm当前变量在寄存器(工作内存)中的值是不确定的需要从主存中读取synchronize则是锁定当前变量只有当前线程可以访问该变量其他线程被阻塞。volatile仅能实现变量的修改可见性不能保证原子性synchronize可以保证变量的修改可见性和原子性。volatile不会造成线程的阻塞synchronize可能会造成线程的阻塞。volatile标记的变量不会被编译器优化synchronize标记的变量可以被编译器优化20.synchronized 和 Lock 有什么区别synchronized是关键字属于jvm层面Lock是具体类是api层面的锁synchronized无法获取锁的状态Lock可以判断synchronized用于少量同步Lock用于大量同步。21.synchronized 和 ReentrantLock 区别是什么synchronized代码执行结束后线程自动释放对锁的占用Reentrantlock需要手动释放锁synchronized不可中断除非抛出异常或者执行完成Reentrantlock可中断synchronize非公平锁Reentrantlock默认非公平锁也可公平锁ReentrantLock用来实现分组唤醒需要唤醒的线程可以精确唤醒而不是像synchronized要么随机唤醒一个要么唤醒全部线程。22.说一下 atomic 的原理作用多线程下将属性设置为atomic可以保证读取数据的一致性。CASCompare And Swap乐观锁的机制先比较再交换以实现原子性23.理解乐观锁和悲观锁乐观锁认为每次去拿数据的时候别人不会修改所以不会上锁但是每次要拿数据的时候都会先判断数据是否被别人修改悲观锁认为每次去拿数据的时候别人都会修改所以每次都会上锁。使用场景乐观锁使用于多读少写的应用类型这样可以提高吞吐量相反的情况则使用悲观锁四、反射1.什么是反射java反射机制是指在运行状态中对于任意一个类都能够知道这个类的所有属性和方法对于任意一个对象都能够调用它的任意一个方法和属性这种动态获取的信息以及动态调用对象的方法的功能成为java的反射机制。2.什么是 java 序列化什么情况下需要序列化序列化将java对象转换成字节流的过程。反序列化将字节流转换成java对象的过程。当java对象需要在网络上传输或者持久化存储到文件中时就需要对Java对象进行序列化处理。序列化的实现类实现Serializable接口。3.动态代理是什么有哪些应用在运行时创建一个新的类即创建动态代理可以调用和扩展目标类的方法。动态代理的类是自动生成的。应用Spring的AOP加事务加权限加日志4.怎么实现动态代理基于jdk需要实现InvocationHandler接口重写invoke方法。基于cglib需要jar包依赖基于javassist篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、场景题、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho五、对象克隆61.为什么要使用克隆如果直接使用给对象赋值的话那么两个对象其实指向的是同一个地址其中一个值改变时另一个也会随之改变。62.如何实现对象克隆1、实现Coloneable接口并重写Object类中的clone()方法2、实现Serializable接口通过对象的序列化和反序列化实现克隆可以实现真正的深度克隆。63.深克隆和浅克隆区别是什么深克隆新旧对象不共享一个地址浅克隆新旧对象共享一个地址改变一个另一个也会改变六、Java Web1.jsp 和 servlet 有什么区别JspJava Server Page是一种动态页面技术其根本是一个简化的Servlet设计用来封装产生动态网页的逻辑处理。Servlet服务器端的Java应用程序具有独立于平台和协议的特性可以生成动态的Web页面。它担当客户请求与服务器响应的中间层。相同点jsp经编译后就变成了Servletjsp本质就是servletjvm只能识别java的类不能识别jsp代码web容器将jsp的代码编译成jvm能够识别的java类。2.jsp 有哪些内置对象作用分别是什么request用户端请求get/postresponse网页传回用户端的响应pageContext管理网页的属性session与请求有关的会话期application servlet正在执行的内容out用来传送回应的输出config servlet的架构部件page JSP网页本身exception针对错误网页未捕捉的例外3.说一下 jsp 的 4 种作用域application在所有应用程序中有效session在当前会话中有效request在当前请求中有效page在当前页面有效4.session 和 cookie 有什么区别存储位置不同cookie的数据信息存放在客户端浏览器上session的数据信息存放在服务器上存储容量不同单个cookie保存的数据4Kb一个站点最多保存20个cookie对于session来说没有上限存储方式不同cookie中只能保管ASCII字符串并需要通过编码方式存储为Unicode字符或者二进制数据session中能够存储任何类型的数据隐私策略不同cookie对客户端是可见的所以它是不安全的session存储在服务器上对客户端是透明的不会信息泄露有效期不同可以通过设置cookie的属性使cookie长期有效session不能达到长期有效的结果服务器压力不同cookie保存在客户端不占用服务器资源session是保存在服务器的如果并发访问的用户十分多会产生很多的session耗费大量的内存浏览器支持不同cookie是需要浏览器支持的假如客户端禁用了cookie或者不支持cookie则会话跟踪会失效session只能在本窗口以及子窗口有效而cookie可以为本浏览器上的一切窗口有效跨域支持不同cookie支持跨域名访问session不支持跨域名访问5.说一下 session 的工作原理客户端登录完成之后服务器会创建相应的sessionsession创建完成之后会把session的id发送给客户端客户端再存储到浏览器中。这样客户端每次访问服务器时都会带着sessionid服务器拿到sessionid之后在内存找到与之对应的session就可以正常工作了。6.如果客户端禁止 cookiesession 还能用吗如果浏览器禁用了cookie那么客户端访问服务端时无法携带sessionid服务端无法识别用户身份便无法进行会话控制session就会失效但是可以通过其他办法实现通过URL重写把sessionid作为参数追加的原URL中后续的浏览器与服务器交互中携带session服务器的返回数据中包含sessionid浏览器发送请求时携带sessionid参数7.spring mvc 和 struts 的区别是什么拦截机制不同Struts2是类级别的拦截每次请求就会创建一个ActionSpringMVC是方法级别的拦截一个方法对应一个Request上下文。底层框架不同Struts2采用Filter实现SpringMVC采用Servlet实现性能不同Struts2需要加载所有的属性值注入SpringMVC实现了零配置由于SpringMVC基于方法的拦截。所以SpringMVC开发效率和性能高于Struts2配置方面SpringMVC 和 Spring 是无缝的从这个项目的管理和安全上也比Struts2高。8.如何避免 sql 注入SQL注入是Web开发中最常见的一种安全漏洞可以用它来从数据库获取敏感信息进行数据库的一系列非法操作。校验参数的数据格式是否合法对进入数据库的特殊字符进行转义处理或编码转换预编译SQL参数化查询方式避免SQL拼接发布前利用工具进行SQL注入检测9.什么是 XSS 攻击如何避免XSSCross Site Scripting跨站脚本攻击它是Web程序中常见的漏洞。原理攻击者往web页面里插入恶意的HTML代码当用户浏览该页面时嵌入其这个你的HTML代码会被执行从而达到恶意攻击用户的目的。避免措施web页面中可由用户输入的地方对输入的数据转义、过滤处理前端对HTML标签属性、css属性赋值的地方进行校验后台输出页面的时候也需要对输出内容进行转义、过滤处理10.什么是 CSRF 攻击如何避免CSRFCross-site request forgery也被称为one-click attack 或者 session riding通常缩写为CSRF或XSRF是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。预防措施验证HTTP Referer字段验证码添加token验证尽量使用post限制get七、异常1.throw 和 throws 的区别throw表示方法内抛出某种异常对象如果异常对象不是RuntimeException则需要在方法声明时加上该异常的抛出即需要加上throws语句或者在方法体内try catch异常否则编译会报错执行到throw语句则后面的语句块不再执行throws方法的定义上使用此关键字表示这个方法可能抛出某种异常需要由方法的调用者进行异常处理。2.final、finally、finalize 有什么区别final修饰类时表示不能被继承修饰方法时表示不能被重载修饰变量时表示不能被修改。finally在异常处理时提供finally代码块来执行异常处理。finalize是方法名java允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。3.try-catch-finally 中哪个部分可以省略catch 和 finally可以被省略其中一个finally代码块是无论是否捕捉到异常都会执行finally代码块的逻辑。4.try-catch-finally 中如果 catch 中 return 了finally 还会执行吗捕获到异常后不会直接返回会先执行完finally代码块的语句继续执行catch代码块中的return。5.常见的异常类有哪些NullPointerException、SQLException、IndexOutOfBoundException、NumberFormatException、FileNotFoundExceptionIOException、IllegalArgumentException、NoSuchMethodException八、网络1.http 响应码 301 和 302 代表的是什么有什么区别301Moved Permanently ——被请求的资源已经永久移动到新位置302Found——被请求URL临时转移到新的URL其他的响应码信息响应(100-199)、成功响应(200-299)、重定向(300-399)、客户端错误(400-499)、服务器错误(500-599)2.forward 和 redirect 的区别redirect是客户端发起的请求forward是服务端发起的请求redirect浏览器显示被请求的URLforward浏览器地址不显示被请求的URLredirect重新开始一个request原页面的request生命周期结束forward另一个连接的时候request变量是在其生命周期内的。redirect实质上是两次HTTP请求forward是一次请求3.简述 tcp 和 udp的区别TCP是面向连接的TCP提供可靠的服务通过TCP连接传输的数据不会丢失没有重复并且按顺序到达。UDP是无连接的没有可靠性但是速度快操作简单要求系统资源较少可以实现广播发送。TCP是面向字节流的UDP是面向报文的TCP是全双工的可靠信道UDP是不可靠信道4.tcp 为什么要三次握手两次不行吗为什么两次握手只能保证单向连接是畅通的。只有经过第三次握手才能确保双向都可以收到对方发送的数据5.说一下 tcp 粘包是怎么产生的TCP粘包发送方发送的多个数据包到接收方缓冲区首尾相连粘成一包被接收产生原因TCP为提高传输效率发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少通常TCP会根据优化算法把这些数据合成一包后一次发送出去这样接收方就收到了粘包数据。接收方原因接收方引起的粘包是由于接收方用户进程不及时接收数据从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区用户进程从该缓冲区取数据若下一包数据到达时前一包数据尚未被用户进程取走则下一包数据放到系统接收缓冲区时就接到前一包数据之后而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据这样就一次取到了多包数据。6.OSI 的七层模型都有哪些OSIOpen System Interconnection Reference Model开放式系统互联网通信应用层、表达层、会话层、传输层、网络层、数据链路层、物理层7.get 和 post 请求有哪些区别get是从服务器上获取数据post是向服务器传送数据get请求通过URL直接请求数据数据信息可以在URL中看到post请求是放在请求头中的用户看不到get传送的数据量小有限制不能大于2kbpost传送的数据可以没有限制get安全性比较低post相对较安全8.如何实现跨域使用JSONP利用了script不受同源策略的限制代理跨域请求HTML5 postMessage方法修改document.domain跨子域基于HTML5 websocket协议9.说一下 JSONP 实现原理同源同协议、同主机、同端口号json是一种数据格式jsonp是一种数据调用的方式带callback的json就是jsonp。首先在客户端注册一个callback然后把callback的名字传给服务器此时服务器先生成json数据然后以JavaScript语法的方式生成function返回给客户端客户端解析script并执行callback函数。简单的说就是利用script标签没有跨域限制的漏洞来达到与第三方通讯的目的。10.单工、半双工、全双工单工只支持数据在一个方向上传输半双工允许数据在两个方向上传输但在某一时刻只允许数据在同一个方向上传输全双工允许数据可以同时接收和发送信息实现双向通信九、设计模式1.说一下你熟悉的设计模式单例模式懒汉式先声明变量等到实际用到时再创建对象饿汉式直接创建对象工厂模式工厂类可以根据条件生成不同的子类实例这些子类有一个公共的抽象父类并且实现了相同的方法但是这些方法针对不同的数据进行了不同的操作。适配器模式把一个类的接口变换成客户端所期待的另一种接口从而使原本因接口不匹配而无法在一起使用的类能够在一起工作。模板方法模式提供一个抽象类将部分逻辑以具体方法或构造器的形式实现然后声明一些抽象方法来迫使子类实现剩余的逻辑不同的子类可以从不同的方式实现这些抽象方法从而实现不同的业务逻辑。2.简单工厂和抽象工厂有什么区别简单工厂由一个工厂对象创建产品实例简单工厂模式的工厂类一般是使用静态方法通过不同的参数创建不同的对象的实例。可以生产结构中的任意产品不能增加新的产品。抽象工厂提供一个创建一系列相关或相互依赖对象的接口而无需制定他们具体的类生产多个系列产品生产不同产品族的全部产品不能新增产品可以新增产品族。十、Spring/Spring MVC1.为什么要使用 spring方便解耦便于开发支持aop编程声明式事务的支持方便程序的测试方便集成各种优秀的框架降低JavaEE API的使用难度2.解释一下什么是 aopAOPAspect Oriented Programming面向切面编程通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。通俗的解释在运行时动态的将代码切入到类的指定方法、指定位置的编程思想就是面向切面的编程。3.解释一下什么是 iocIOCInversion Of Control控制反转它是一种设计思想在java开发中将设计好的对象交给容器控制而不是显示地用代码进行对象的创建。把创建和查找依赖对象的控制权交给IOC容器由IOC容器进行注入、组合对象这样对象与对象之间是松耦合便于测试功能可复用使得程序的整个体系结构可维护灵活性、扩展性变高。4.spring 有哪些主要模块Spring Core框架的基础部分提供IOC容器对bean进行管理。Spring Context基于bean提供上下文信息扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。Spring DAO提供了JDBC的抽象层它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码还提供了声明性事务管理方法Spring ORM提供了常用的“对象/关系”映射APIs的集成层。其中包括JPA、JDO、hibernate、Mybatis等。Spring AOP提供了面向切面编程。Spring Web提供了基础的Web开发的上下文信息可与其他Web进行集成。Spring Web MVC提供了Web应用的Model-View-Controller 全功能实现。5.spring 常用的注入方式有哪些构造方法注入、setter注入、基于注解的注入6.spring 中的 bean 是线程安全的吗Spring 中的Bean本身不具备线程安全的特性7.spring 支持几种 bean 的作用域singleton单例默认作用域prototype原型每次创建一个新对象request请求每次Http请求创建一个新对象适用于WebApplicationContext环境下session会话同一个会话共享一个实例不同会话使用不同的实例global-session全局会话所有会话共享一个实例篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了Java面试、场景题、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafc需要全套面试笔记及答案【点击此处即可/免费获取】https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho8.spring 自动装配 bean 有哪些方式default默认的方式和no方式一样no不自动装配需要使用ref/节点或参数byName根据名称进行装配byType根据类型进行装配constructor根据构造函数进行装配9.spring 事务实现方式有哪些编程式事务管理需要在代码中调用beginTransaction()、commit()、rolback()等事务管理相关的方法基于TransactionProxyFactoryBean的声明式事务管理基于Transactional的声明式事务管理基于Aspectj AOP配置事务