版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
(2025年)Java面试题及答案(新版)Java中Vector与ArrayList的区别是什么?实际项目中如何选择?Vector是线程安全的动态数组,所有公开方法都使用synchronized修饰,保证了多线程环境下的原子性;ArrayList是非线程安全的,性能更优。Vector的扩容机制默认是翻倍(若未指定增量则newCapacity=oldCapacity+((capacityIncrement>0)?capacityIncrement:oldCapacity)),而ArrayList默认扩容为原容量的1.5倍(newCapacity=oldCapacity+(oldCapacity>>1))。实际项目中,若无需线程安全(如单线程环境或外层已做同步控制),优先选择ArrayList以提升性能;若必须保证线程安全且并发量不高(如遗留系统),可使用Vector;高并发场景建议通过Collections.synchronizedList(ArrayList)或直接使用CopyOnWriteArrayList,后者在写操作时复制数组,适合读多写少的场景。Java17到Java21引入了哪些关键特性?各自解决了什么问题?Java17:密封类(SealedClasses)通过permits关键字限制类的继承,增强类型系统的安全性,适用于需要严格控制扩展的场景(如枚举扩展);模式匹配(PatternMatchingforinstanceof)简化类型检查和强制转换代码,例如`if(objinstanceofStrings){...}`替代传统的类型判断,减少空指针风险。Java18:UTF-8字面量(UTF-8Literals)默认源文件编码为UTF-8,解决不同平台编码不一致导致的乱码问题;简单Web服务器(SimpleWebServer)提供轻量级HTTP服务,适用于快速测试或静态资源托管。Java19:虚拟线程(VirtualThreads)基于ProjectLoom,创建成本极低(百万级线程无压力),解决传统平台线程(OS线程)在高并发IO场景下的资源瓶颈,例如`try(varexecutor=Executors.newVirtualThreadPerTaskExecutor()){...}`实现高效并发。Java20:记录类增强(RecordPatterns)与模式匹配嵌套,支持更复杂的对象解构,如`if(objinstanceofPoint(intx,inty)){...}`直接提取记录类字段;向量API(VectorAPI)优化数值计算,通过SIMD指令提升向量化操作性能(如矩阵运算)。Java21:序列(Sequences)作为不可变、有序的元素集合,替代部分场景下的List,提供更严格的不可变性保证;作用域值(ScopedValues)为线程内的局部变量提供更安全的传递方式,替代ThreadLocal,避免内存泄漏和跨线程污染。如何实现一个线程安全的懒汉式单例?需考虑反射和序列化攻击。传统懒汉式单例在多线程下可能创建多个实例,需结合双重检查锁定(DCL)和volatile关键字:```javapublicclassSingleton{privatestaticvolatileSingletoninstance;//volatile禁止指令重排privateSingleton(){if(instance!=null){//防御反射攻击thrownewIllegalStateException("Instancealreadyinitialized");}}publicstaticSingletongetInstance(){if(instance==null){//第一次检查synchronized(Singleton.class){if(instance==null){//第二次检查instance=newSingleton();}}}returninstance;}//防止序列化攻击protectedObjectreadResolve(){returngetInstance();}}```关键点:volatile保证instance的可见性和禁止构造函数的指令重排(避免其他线程获取到未初始化完成的实例);私有构造函数中检查instance是否已存在,防止反射调用构造方法创建新实例;重写readResolve()方法,反序列化时返回已存在的实例,避免提供新对象。Synchronized与ReentrantLock的区别及各自适用场景?核心区别:1.锁获取方式:synchronized是JVM内置锁,通过monitorenter/monitorexit字节码实现;ReentrantLock是JDK层面的显式锁(实现Lock接口),通过AQS(AbstractQueuedSynchronizer)实现。2.可中断性:ReentrantLock支持lockInterruptibly()方法,允许在等待锁时响应中断;synchronized无法中断,只能一直等待。3.公平性:ReentrantLock可通过构造函数指定公平锁(FairSync)或非公平锁(NonfairSync),默认非公平(提升吞吐量);synchronized是非公平锁。4.条件变量:ReentrantLock通过newCondition()获取多个Condition对象,支持更细粒度的等待/通知(如生产者-消费者模型中区分不同类型的等待队列);synchronized仅支持一个wait/notify队列。适用场景:简单同步需求(如方法同步)使用synchronized,代码更简洁;需要可中断、公平锁或多条件变量时选择ReentrantLock(如高并发的资源分配系统)。JVM中ZGC的核心设计思想是什么?如何实现低停顿?ZGC是Java11引入的可扩展低延迟垃圾收集器,目标是停顿时间不超过10ms,支持TB级堆内存。核心设计:1.着色指针(ColoredPointers):将对象地址的高4位用于存储标记信息(Marked0、Marked1、Remapped、Finalizable),标记和重定位操作直接在指针上完成,无需扫描根集合,减少STW时间。2.并发执行:标记、重定位、重映射阶段均与应用线程并发执行,仅初始标记(标记根对象)和最终标记(处理并发阶段的增量更新)需要短暂STW。3.内存多重映射(Multi-Mapping):将同一物理内存映射到多个虚拟地址空间(Marked0、Marked1、Remapped),通过切换映射关系实现指针的重定位,避免移动对象时修改所有引用。低停顿的关键在于将大部分GC操作并发化,仅保留极短的STW阶段,同时通过着色指针和多重映射技术减少对应用线程的阻塞。SpringBoot自动配置的核心原理是什么?如何自定义一个Starter?自动配置的核心是@SpringBootApplication注解,其包含@SpringBootConfiguration(替代@Configuration)、@EnableAutoConfiguration(触发自动配置)和@ComponentScan(扫描组件)。@EnableAutoConfiguration通过AutoConfigurationImportSelector加载META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中定义的自动配置类,每个配置类通过@Conditional系列注解(如@ConditionalOnClass、@ConditionalOnMissingBean)判断是否生效。自定义Starter步骤:1.创建Maven/Gradle项目,坐标命名建议为xxx-spring-boot-starter(如mybatis-spring-boot-starter)。2.在src/main/resources/META-INF/spring下创建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,列出自动配置类全限定名。3.编写自动配置类(如MyServiceAutoConfiguration),使用@Configuration标记,内部通过@Bean定义组件,并通过@ConditionalOnClass(MyService.class)、@ConditionalOnMissingBean等条件控制。4.提供配置属性类(如@ConfigurationProperties(prefix="my.service")),绑定perties中的配置项。5.打包发布,其他项目引入依赖后,自动配置类会根据条件自动生效,用户可通过配置文件覆盖默认属性。如何解决分布式系统中的缓存一致性问题?缓存一致性指数据库与缓存数据的同步问题,常见方案:1.旁路缓存模式(Cache-Aside):读操作先查缓存,未命中则查数据库并更新缓存;写操作先更新数据库,再删除缓存(而非更新)。删除缓存的原因是避免数据库主从延迟导致缓存与主库数据不一致(如写主库后立即更新缓存,但从库未同步,此时读从库可能返回旧数据并更新缓存)。2.读写穿透(Read/WriteThrough):缓存层代理数据库操作,读缓存未命中时由缓存层加载数据库数据并更新;写操作时缓存层同步更新数据库和缓存,适合强一致性场景但性能较低。3.异步更新(Cache-As-SoR):以缓存为数据源,写操作直接更新缓存,通过异步任务(如MQ)将数据同步到数据库。需处理缓存失效时的持久化问题(如缓存宕机后从数据库恢复)。4.时间一致性:设置合理的缓存过期时间(TTL),结合主动更新,适用于允许短时间不一致的场景(如商品详情页)。实际项目中,旁路缓存+延迟双删(写数据库后先删缓存,延迟一段时间再次删缓存)是常用方案,可解决主从复制延迟导致的脏数据问题。例如:```java//写操作updateDB(data);deleteCache(key);//延迟500ms后再次删除executor.schedule(()->deleteCache(key),500,TimeUnit.MILLISECONDS);```MySQL中覆盖索引与回表的关系?如何通过Explain优化查询?覆盖索引指查询所需的所有列都包含在索引中,无需回表查询主键对应的行数据。例如,若有索引(idx_name_age(name,age)),查询`SELECTname,ageFROMuserWHEREname='张三'`可直接通过该索引获取结果,无需访问主键索引。回表发生在查询列不在索引中时,需先通过二级索引找到主键,再通过主键索引(聚簇索引)查询完整行数据。例如,索引(idx_name(name)),查询`SELECTFROMuserWHEREname='张三'`需要回表。通过Explain命令的type(访问类型,理想为ref或eq_ref)、key(实际使用的索引)、Extra(是否Usingindex,即覆盖索引)字段优化:-若Extra显示Usingwhere;Usingindex,说明使用了覆盖索引,性能最佳。-若Extra显示Usingfilesort或Usingtemporary,需检查是否缺少合适的索引(如排序字段未建索引)。-避免SELECT,只查询需要的列,增加覆盖索引的可能性。例如,将`SELECT`改为`SELECTid,name`,并为(id,name)建立联合索引。什么是响应式编程?SpringWebFlux与SpringMVC的核心区别?响应式编程是一种面向数据流和变化传播的编程范式,通过异步非阻塞的方式处理事件,适用于高并发、低延迟的场景。核心概念包括发布者(Publisher)、订阅者(Subscriber)、背压(Backpressure,订阅者控制发布者的发送速率)。SpringWebFlux与SpringMVC的区别:1.编程模型:SpringMVC基于ServletAPI,是同步阻塞模型(每个请求对应一个线程,线程等待IO时阻塞);WebFlux基于Reactor(实现ReactiveStreams规范),使用异步非阻塞模型(少量线程处理多个请求,通过事件循环响应IO完成事件)。2.适用场景:MVC适合传统业务(如事务操作、复杂逻辑),WebFlux适合IO密集型场景(如微服务网关、实时数据推送),能以更少的资源处理更多并发请求。3.注解支持:两者均支持@Controller、@RequestMapping,但WebFlux支持返回Reactive类型(Mono、Flux),MVC返回传统类型(如String、ModelAndView)。4.服务器支持:MVC依赖Servlet容器(Tomcat、Jetty);WebFlux支持非Servlet的Reactive服务器(Netty、Undertow)。示例:WebFlux处理请求返回Flux:```java@GetMapping("/users")publicFlux<User>getUsers(){returnuserRepository.findAll();//返回Reactive数据}```如何设计一个高并发的秒杀系统?需要考虑哪些关键点?高并发秒杀系统的核心目标是限流、防刷、快速响应,关键点包括:1.流量拦截:-前端限流:按钮灰化(防止重复点击)、验证码(防止机器刷单)。-网关层:Nginx限流(限制IP请求频率)、用户token校验(确保登录用户)。-服务层:Redis预减库存(秒杀前将库存加载到Redis,避免直接访问数据库)、令牌桶/漏桶算法(限制每秒请求数)。2.库存处理:-数据库层:乐观锁更新库存(`UPDATEstockSETcount=count-1WHEREid=?ANDcount>0`),避免超卖。-Redis层:使用Lua脚本原子操作库存(`ifredis.call('get',KEYS[1])>0then...end`),保证减库存和提供订单的原子性。3.异步处理:-秒杀请求通过MQ(如RocketMQ、Kafka)异步处理,将同步请求转为异步任务,减少服务端压力。-结果通知:通过WebSocket或轮询告知用户秒杀结果,避免长连接阻塞。4.防刷机制:-用户维度:限制同一用户每分钟请求次数(Redis记录用户ID+时间戳)。-设备维度:校验设备指纹(如IMEI、UUID),防止同一设备多账号刷单。5.降级与熔断:-使用Resilience4J或Hystrix设置熔断规则,当库存为0或服务异常时,快速返回“已售罄”。-降级页面:秒杀结束后,所有请求直接返回静态页面,减少服务端处理。JVM内存模型中堆和栈的区别?OOM可能发生在哪些区域?堆(Heap)是所有线程共享的内存区域,存储对象实例和数组,由垃圾收集器管理;栈(JavaVirtualMachineStacks)是线程私有的,每个线程对应一个栈,存储栈帧(局部变量表、操作数栈、动态链接、方法出口等)。区别:-线程共享性:堆共享,栈私有。-存储内容:堆存对象,栈存方法调用的局部变量和操作数。-内存管理:堆由GC自动回收,栈随方法调用/返回自动分配/释放。OOM可能发生的区域:1.堆(OutOfMemoryError:Javaheapspace):对象创建过多且无法被回收(如内存泄漏),可通过-Xmx调整堆大小。2.方法区/元空间(OutOfMemoryError:Metaspace):类信息、常量、静态变量等过多(如动态提供大量Class对象),通过-XX:MaxMetaspaceSize限制。3.虚拟机栈(StackOverflowError或OutOfMemoryError):递归深度过深导致栈帧过多(StackOverflow),或创建大量线程导致栈空间耗尽(OutOfMemory,每个线程栈默认1MB,大量线程会耗尽内存)。4.直接内存(OutOfMemoryError):通过Unsafe或ByteBuffer.allocateDirect()分配的堆外内存,超出-XX:MaxDirectMemorySize限制时触发。如何优化Java应用的启动时间?启动时间优化需从类加载、资源初始化、配置加载等方面入手:1.减少类加载数量:-移除冗余依赖(通过Maven的dependency:analyze或Gradle的dependencies任务检查未使用的依赖)。-使用类加载器过滤(如自定义类加载器仅加载必要类),但需注意Spring等框架可能依赖全类扫描。2.优化静态资源初始化:-延迟初始化非必须的Bean(@Lazy注解),将启动时初始化转为首次使用时初始化。-避免在静态代码块中执行耗时操作(如读取大文件、远程调用)。3.配置文件优化:-使用profile分离环境配置(如perties),避免加载无关配置。-减少@Value注解的使用,通过Environment对象懒加载配置值。4.使用AOT编译(Ahead-Of-Time):-SpringBoot3.0+支持GraalVMnative-image提供原生可执行文件,提前编译Java代码为机器码,大幅减少启动时间和内存占用(如从几秒降至几十毫秒)。5.调整JVM参数:-启用分层编译(-XX:+TieredCompilation),热点方法及时编译为机器码。-减少堆初始大小(-Xms)与最大堆(-Xmx)的差距,避免动态扩容耗时。如何设计一个线程池?核心参数有哪些?如何根据任务类型调整?线程池的核心参数:-corePoolSize(核心线程数):保留在线程池中的线程数(即使空闲)。-maximumPoolSize(最大线程数):线程池允许的最大线程数。-keepAliveTime(存活时间):非核心线程空闲后存活的时间。-unit(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 贵港港中心港区京屋作业区1号至3号泊位工程环境影响报告书
- 2024年蕲春县招教考试备考题库含答案解析(夺冠)
- 2024年贞丰县招教考试备考题库带答案解析(夺冠)
- 2025年皖南医学院马克思主义基本原理概论期末考试模拟题带答案解析(必刷)
- 2025年海南经贸职业技术学院单招职业适应性考试题库带答案解析
- 2024年阳泉师范高等专科学校马克思主义基本原理概论期末考试题附答案解析(必刷)
- 2025年广州华立学院马克思主义基本原理概论期末考试模拟题及答案解析(必刷)
- 2024年湖南外贸职业学院马克思主义基本原理概论期末考试题及答案解析(夺冠)
- 2025年临泽县招教考试备考题库及答案解析(夺冠)
- 2025年洛阳文化旅游职业学院单招职业技能考试题库附答案解析
- 护理护理科研与论文写作
- 2025年健康体检中心服务与质量管理手册
- 2025-2030中国骆驼市场前景规划与投资运作模式分析研究报告
- 2026中国电信四川公用信息产业有限责任公司社会成熟人才招聘备考题库及完整答案详解一套
- 钢结构玻璃雨棚安装施工方案
- 鄂尔多斯辅警考试题型及答案
- 《中华人民共和国危险化学品安全法》全套解读
- 房建工程电气安装施工方案
- 同等学力申硕公共管理真题及答案
- 2025初三英语中考英语满分作文
- 2022危险废物管理计划和管理台账制定技术导则
评论
0/150
提交评论