java高级笔试题(附答案)_第1页
java高级笔试题(附答案)_第2页
java高级笔试题(附答案)_第3页
java高级笔试题(附答案)_第4页
java高级笔试题(附答案)_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

java高级笔试题(附答案)一、选择题(每题2分,共20分)1.关于Java内存模型(JMM),以下说法错误的是()A.JMM通过限制编译器和处理器的重排序来提供内存可见性保证B.volatile变量的写操作happens-before后续对该变量的读操作C.线程对共享变量的修改会直接写入主内存,无需经过工作内存D.synchronized同步块的解锁操作happens-before后续对同一锁的加锁操作2.以下关于ConcurrentHashMap的描述,正确的是()A.JDK1.7中使用分段锁(Segment),默认16个段,并发度为16B.JDK1.8中放弃了锁分段,改用synchronized+CAS,因此不再支持锁升级C.put操作在JDK1.8中不会触发扩容D.size()方法在JDK1.8中通过直接遍历所有桶统计元素数量3.关于Spring的循环依赖,以下说法正确的是()A.只有通过构造器注入的循环依赖可以被Spring自动解决B.Spring通过三级缓存解决循环依赖,其中二级缓存存储完整对象C.@Scope("prototype")的Bean之间的循环依赖无法被自动解决D.三级缓存中存储的是原始对象的工厂方法,用于生成代理对象4.以下垃圾收集器中,属于CMS收集器特点的是()A.基于标记-整理算法,适用于老年代B.会产生“浮动垃圾”,需要预留空间C.采用Region分区,支持停顿时间预测D.初始标记阶段需要STW,但耗时极短5.关于Java线程池,以下说法错误的是()A.ThreadPoolExecutor的拒绝策略包括AbortPolicy、CallerRunsPolicy等B.corePoolSize是线程池核心线程数,即使空闲也不会被销毁C.使用Executors.newFixedThreadPool(10)创建的线程池,工作队列是SynchronousQueueD.当任务数超过最大线程数+队列容量时,触发拒绝策略6.以下代码的输出结果是()```javapublicclassTest{staticclassA{publicvoidm(){System.out.println("A.m");}}staticclassBextendsA{@Overridepublicvoidm(){System.out.println("B.m");}}publicstaticvoidmain(String[]args){Aa=newB();a.m();((B)a).m();}}```A.A.mB.mB.B.mB.mC.A.mA.mD.编译错误7.关于Java反射,以下说法错误的是()A.通过反射可以访问私有方法,需调用setAccessible(true)B.Class.forName()默认使用调用者的类加载器加载类C.反射获取Method对象时,若方法重载,需指定参数类型区分D.反射调用方法的性能一定比直接调用差8.以下关于设计模式的应用场景,错误的是()A.工厂模式:需要根据不同参数创建不同类型的对象B.单例模式:需要确保一个类在JVM中仅存在一个实例C.观察者模式:需要实现对象间的一对多依赖,当主题状态变化时通知所有观察者D.装饰器模式:需要为一个类添加多个不相关的功能,通过继承实现9.关于MyBatis的缓存机制,以下说法正确的是()A.一级缓存是SqlSession级别的,默认开启B.二级缓存是全局的,所有SqlSession共享C.二级缓存需要在Mapper文件中配置<cache/>标签D.查询结果会同时存入一级缓存和二级缓存,无需考虑缓存一致性10.以下代码中,final变量x的初始化是否符合Java规范?()```javapublicclassTest{finalintx;publicTest(inty){this.x=y;if(y<0){thrownewIllegalArgumentException();}}}```A.符合,x在构造方法中被显式赋值B.不符合,x可能未被初始化(如构造方法抛出异常时)C.符合,构造方法抛出异常不影响final变量的初始化D.不符合,final变量必须在声明时初始化二、简答题(每题5分,共30分)1.请简述JDK1.8中HashMap的扩容机制(包括触发条件、扩容过程、性能优化点)。2.对比synchronized和ReentrantLock的异同,说明ReentrantLock的优势场景。3.什么是双亲委派模型?简述其工作流程及设计目的。4.请说明Spring中@Autowired和@Resource的区别(从注解来源、注入方式、参数支持等方面)。5.简述Java内存泄漏的常见场景及排查方法(至少列举3种场景,2种排查工具)。6.什么是分布式事务?请对比TCC(Try-Confirm-Cancel)和Seata的AT模式的优缺点。三、编程题(每题10分,共30分)1.实现一个线程安全的单例模式(要求:懒加载、支持高并发、避免反射破坏)。2.使用CompletableFuture实现以下需求:-异步执行任务A(耗时2秒,返回结果String)-任务A完成后,并行执行任务B(耗时1秒)和任务C(耗时1.5秒)-任务B和任务C均完成后,合并结果并输出最终信息(格式:“A结果+B结果+C结果”)3.设计一个简单的SpringIOC容器(要求:支持@Autowired注解注入、支持单例Bean的创建,写出核心类和关键逻辑)。四、场景分析题(20分)某电商系统的秒杀模块出现性能问题,具体表现为:-高并发下数据库连接池耗尽,频繁抛出“无法获取连接”异常-部分用户请求超时,返回504错误-缓存(Redis)中热点商品的key被频繁击穿,导致数据库压力激增请分析可能的原因,并提出至少3个针对性的优化方案(需说明具体实现方式)。答案一、选择题1.C(线程对共享变量的修改需先写入工作内存,再同步到主内存)2.A(JDK1.8支持锁升级;put会触发扩容;size()通过统计baseCount和counterCells)3.C(构造器注入的循环依赖无法解决;二级缓存存储早期对象;三级缓存存储工厂)4.B(CMS基于标记-清除,产生浮动垃圾;初始标记需要STW且耗时较长;G1使用Region)5.C(newFixedThreadPool的工作队列是LinkedBlockingQueue)6.B(动态绑定,无论是否强制转换,调用的都是B的m方法)7.D(反射调用在多次调用后,JIT会优化,性能接近直接调用)8.D(装饰器模式通过组合而非继承实现功能扩展)9.A(二级缓存是namespace级别的;需配置且默认不开启;二级缓存依赖一级缓存)10.A(构造方法抛出异常时,对象未完成创建,final变量已显式赋值)二、简答题1.HashMap扩容机制触发条件:当元素数量超过阈值(capacity×loadFactor)或链表长度≥8且数组长度<64时触发扩容。扩容过程:-新容量为原容量的2倍(newCap=oldCap<<1),新阈值同步翻倍。-遍历原数组的每个桶,将节点重新分配到新数组的对应位置(通过e.hash&(newCap-1)计算索引)。-链表节点根据“hash&oldCap”是否为0分为低位链(保留原索引)和高位链(索引=原索引+oldCap),避免重新计算哈希。优化点:JDK1.8通过位运算替代JDK1.7的rehash计算,减少性能损耗;链表过长时转换为红黑树(树化阈值8,反树化阈值6),提升查询效率。2.synchronized与ReentrantLock对比相同点:均用于实现线程同步,保证互斥性和可见性。不同点:-锁类型:synchronized是关键字,JVM实现;ReentrantLock是类,API实现。-公平性:synchronized是非公平锁;ReentrantLock支持公平锁(构造参数指定)。-可中断性:synchronized不可中断;ReentrantLock可通过lockInterruptibly()响应中断。-条件变量:synchronized依赖wait/notify;ReentrantLock通过Condition实现多个等待队列(如生产者-消费者模型中区分“满”和“空”条件)。优势场景:需要公平锁、可中断锁或多条件变量控制时(如复杂的同步逻辑)。3.双亲委派模型工作流程:类加载器收到加载请求时,先委托给父类加载器(非继承关系,而是组合),父类加载器递归向上委托,直到启动类加载器;若父类无法加载(未找到.class文件),则由当前类加载器尝试加载。设计目的:-避免类重复加载(相同类由同一加载器加载,保证唯一性)。-防止核心类被篡改(如用户自定义的java.lang.String会被父类加载器拒绝,保证安全性)。4.@Autowired与@Resource区别-注解来源:@Autowired是Spring注解;@Resource是JSR-250规范注解(Java标准)。-注入方式:@Autowired默认按类型(byType)注入,可通过@Qualifier指定名称;@Resource默认按名称(byName)注入,name参数指定名称,type参数指定类型。-参数支持:@Autowired支持required属性(是否允许注入为null);@Resource支持name和type参数,无required。-作用范围:@Autowired可用于构造器、方法、字段;@Resource主要用于字段和setter方法。5.内存泄漏场景及排查方法常见场景:-静态集合类持有对象引用(如staticMap保存临时对象,未主动清理)。-未关闭的资源(如IO流、数据库连接,未显式调用close())。-监听器/回调未移除(如注册事件监听器后未取消注册,导致对象被长期引用)。-弱引用/软引用使用不当(如本应使用WeakHashMap却用了普通HashMap)。排查工具:-JProfiler:通过内存快照分析对象存活状态,定位大对象或重复对象。-MAT(MemoryAnalyzerTool):分析堆转储文件(.hprof),识别泄漏的对象及其GCRoots。6.分布式事务对比分布式事务:指跨多个服务或数据库的事务,需保证ACID特性。TCC模式:-优点:不依赖数据库事务,可实现跨库、跨服务的事务;性能较高(Try阶段锁定资源,Confirm/Cancel快速提交)。-缺点:业务侵入性强(需实现Try/Confirm/Cancel三个方法);代码复杂度高。SeataAT模式:-优点:无业务侵入(通过代理数据源自动生成回滚日志);开发成本低。-缺点:依赖数据库支持(需undo_log表);全局锁可能影响并发性能(如更新同一行数据时需等待全局锁释放)。三、编程题1.线程安全的单例模式(防反射破坏)```javapublicclassSingleton{//禁止反射调用私有构造privatestaticbooleaninitialized=false;//静态内部类持有单例实例(懒加载+线程安全)privatestaticclassHolder{staticfinalSingletonINSTANCE=newSingleton();}privateSingleton(){synchronized(Singleton.class){if(!initialized){initialized=true;}else{thrownewIllegalStateException("Singletoninstancealreadycreated");}}}publicstaticSingletongetInstance(){returnHolder.INSTANCE;}}```说明:通过静态内部类Holder实现懒加载(类加载时线程安全);通过initialized标志防止反射调用私有构造器(反射调用时会触发构造方法,第二次调用时抛异常)。2.CompletableFuture任务编排```javaimportjava.time.Duration;importjava.util.concurrent.CompletableFuture;importjava.util.concurrent.TimeUnit;publicclassCompletableFutureDemo{publicstaticvoidmain(String[]args){//任务A:耗时2秒,返回"ResultA"CompletableFuture<String>taskA=CompletableFuture.supplyAsync(()->{try{TimeUnit.SECONDS.sleep(2);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}return"ResultA";});//任务A完成后,并行执行B和CCompletableFuture<String>taskB=taskA.thenApplyAsync(aResult->{try{TimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}return"ResultB";});CompletableFuture<String>taskC=taskA.thenApplyAsync(aResult->{try{TimeUnit.SECONDS.sleep(1.5);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}return"ResultC";});//合并B和C的结果CompletableFuture<Void>finalTask=taskB.thenCombine(taskC,(bResult,cResult)->{StringaResult=taskA.join();//获取A的结果returnaResult+"+"+bResult+"+"+cResult;}).thenAccept(System.out::println);finalTask.join();//等待所有任务完成}}```3.简单SpringIOC容器设计核心类:-BeanDefinition:存储Bean的类信息、作用域(单例/原型)、依赖关系。-BeanFactory:核心接口,定义getBean方法。-DefaultListableBeanFactory:实现类,包含BeanDefinition注册表、单例Bean缓存(ConcurrentHashMap)。-AutowiredAnnotationProcessor:处理@Autowired注解的后置处理器。关键逻辑:```javaimportjava.lang.reflect.Field;importjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;//Bean定义classBeanDefinition{privateClass<?>beanClass;privateStringscope="singleton";//默认单例//getter/setter}//IOC容器核心publicclassSimpleBeanFactory{privatefinalMap<String,BeanDefinition>beanDefinitions=newConcurrentHashMap<>();privatefinalMap<String,Object>singletonObjects=newConcurrentHashMap<>();//注册Bean定义publicvoidregisterBeanDefinition(StringbeanName,BeanDefinitionbd){beanDefinitions.put(beanName,bd);}//获取Bean(支持单例)publicObjectgetBean(StringbeanName)throwsException{BeanDefinitionbd=beanDefinitions.get(beanName);if(bd==null){thrownewIllegalArgumentException("Beannotfound:"+beanName);}if("singleton".equals(bd.getScope())){Objectsingleton=singletonObjects.get(beanName);if(singleton==null){singleton=createBean(bd);singletonObjects.put(beanName,singleton);}returnsingleton;}else{returncreateBean(bd);//原型模式每次创建新实例}}//创建Bean实例并注入依赖privateObjectcreateBean(BeanDefinitionbd)throwsException{Class<?>clazz=bd.getBeanClass();Objectbean=clazz.getDeclaredConstructor().newInstance();//处理@Autowired字段for(Fieldfield:clazz.getDeclaredFields()){if(field.isAnnotationPresent(Autowired.class)){field.setAccessible(true);StringdependencyName=field.getName();//假设按名称注入Objectdependency=getBean(dependencyName);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论