版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年java考试题及答案一、单项选择题(每题2分,共20分)1.关于Java中final关键字的使用,以下说法正确的是()A.被final修饰的类可以被继承,但不能修改其非final方法B.final修饰的变量在声明时必须初始化,且不可被重新赋值C.final修饰的方法不能被重载,但可以被重写D.局部变量被final修饰后,在匿名内部类中使用时仍需显式声明为final答案:B解析:A错误,final类不可被继承;C错误,final方法可被重载(重载发生在本类,重写才涉及子类),但不可被重写;D错误,Java8+中局部变量在匿名内部类中使用时,若未被修改则隐式视为final,无需显式声明。2.以下关于抽象类和接口的描述,错误的是()A.抽象类可以有构造方法,接口不能有构造方法B.接口中的方法默认是publicabstract,抽象类中的方法可以是任意访问权限C.一个类可以实现多个接口,但只能继承一个抽象类D.Java8后接口支持默认方法和静态方法,因此接口可以完全替代抽象类答案:D解析:接口无法存储实例变量(除staticfinal常量),抽象类可包含普通成员变量,二者适用场景不同,不能完全替代。3.执行以下代码,输出结果是()```javaList<Integer>list=newArrayList<>();list.add(1);list.add(2);list.add(3);list.removeIf(n->n%2==1);System.out.println(list);```A.[1,2,3]B.[2]C.[1,3]D.[2,3]答案:B解析:removeIf方法删除满足谓词(n%2==1,即奇数)的元素,原列表中的1和3被删除,剩余2。4.关于Java多线程的状态转换,以下说法正确的是()A.调用Thread的start()方法后,线程进入RUNNING状态B.调用wait()方法会使线程进入BLOCKED状态,调用notify()后直接恢复为RUNNABLEC.线程执行完run()方法后进入TERMINATED状态D.调用sleep()方法时,线程会释放持有的锁答案:C解析:A错误,start()后线程进入RUNNABLE状态(可能等待CPU调度);B错误,wait()使线程进入WAITING状态,notify()后进入BLOCKED状态(等待获取锁);D错误,sleep()不会释放锁。5.以下泛型使用中,符合PECS(ProducerExtends,ConsumerSuper)原则的是()A.定义方法参数为List<?superNumber>,用于读取数字元素B.定义方法参数为List<?extendsNumber>,用于向列表中添加Integer元素C.定义方法参数为List<?superInteger>,用于向列表中添加Integer元素D.定义方法参数为List<?extendsNumber>,用于返回列表中的Double元素答案:C解析:PECS原则中,生产者(读取)用extends,消费者(写入)用super。C选项中列表作为消费者(写入Integer),应使用superInteger。6.以下异常处理代码中,可能出现编译错误的是()```javatry{//可能抛出IOException或SQLException的代码}catch(IOException|SQLExceptione){e.printStackTrace();}catch(Exceptione){//①e.printStackTrace();}```A.无错误B.①处编译错误,因为Exception是前一个catch块的父类C.①处编译错误,因为多异常捕获后不能再捕获父类异常D.①处编译错误,因为异常类型顺序错误答案:B解析:多异常捕获的异常类型(IOException和SQLException)的共同父类是Exception,因此后续的catch(Exceptione)会导致编译错误,因为父类异常应在子类之后捕获。7.以下Lambda表达式与函数式接口的匹配,错误的是()A.Runnabler=()->System.out.println("Hello");B.Consumer<String>c=s->s.length();C.Function<Integer,String>f=i->String.valueOf(i);D.Predicate<Integer>p=n->n%2==0;答案:B解析:Consumer的抽象方法是voidaccept(Tt),而B选项的Lambda表达式返回了int(s.length()),与void不匹配。8.关于String、StringBuilder和StringBuffer的描述,错误的是()A.String是不可变类,每次修改都会提供新对象B.StringBuffer是线程安全的,StringBuilder是非线程安全的C.StringBuilder的默认初始容量是16,扩容时是原容量的2倍加2D.拼接大量字符串时,使用String的+操作符效率高于StringBuilder答案:D解析:String的+操作符在编译时会优化为StringBuilder,但循环中拼接时,每次循环都会新建StringBuilder,效率低于显式使用一个StringBuilder。9.以下关于注解的保留策略(RetentionPolicy),对应错误的是()A.RetentionPolicy.SOURCE:注解仅保留在源码中,编译时被丢弃B.RetentionPolicy.CLASS:注解保留在class文件中,运行时不可获取C.RetentionPolicy.RUNTIME:注解保留在运行时,可通过反射获取D.RetentionPolicy.RUNTIME:注解仅在JVM运行期间有效,class文件中不保留答案:D解析:RetentionPolicy.RUNTIME的注解会保留在class文件中,且运行时可通过反射获取。10.Java9引入的模块化系统(JPMS)中,模块描述文件的名称是()A.module-info.javaB.module.mfC.module.xmlD.perties答案:A二、填空题(每空2分,共20分)1.在Java中,使用______关键字修饰的方法表示该方法没有方法体,必须由子类实现(抽象类中的方法)。答案:abstract2.HashMap的默认初始容量是______,当负载因子(loadfactor)默认值为0.75时,当元素数量超过______时会触发扩容。答案:16;12(16×0.75)3.启动一个线程需要调用______方法,而不是直接调用run()方法。答案:start()4.在try-with-resources语句中,要求资源类必须实现______接口。答案:AutoCloseable5.StreamAPI中,______操作(如filter、map)不会立即执行,而______操作(如collect、forEach)会触发流的处理。答案:中间;终止6.通过反射获取类的Class对象的三种方式是:______、______、______(任意写出三种)。答案:类名.class;对象.getClass();Class.forName("全限定类名")7.StringBuilder的初始容量是16,当追加字符串导致容量不足时,会扩容为原容量的______倍加2。答案:28.枚举(enum)的父类是______(填类名)。答案:java.lang.Enum三、简答题(每题6分,共30分)1.简述方法重载(Overload)与方法重写(Override)的区别。答案:重载:发生在同一个类中,方法名相同但参数列表(类型、顺序、个数)不同,与返回值类型无关,是编译时多态的体现。重写:发生在子类与父类之间,方法名、参数列表、返回值类型(或其子类型)完全相同,访问权限不能严于父类,不能重写父类的final、static或private方法,是运行时多态的体现。2.说明ArrayList和LinkedList的适用场景,并分析原因。答案:ArrayList:基于动态数组实现,随机访问(get/set)时间复杂度O(1),但插入/删除(非尾部)需要移动元素,时间复杂度O(n)。适用于频繁查询、较少增删的场景。LinkedList:基于双向链表实现,插入/删除(任意位置)时间复杂度O(1)(需先定位节点),但随机访问需要遍历链表,时间复杂度O(n)。适用于频繁增删、较少查询的场景。3.对比synchronized关键字与ReentrantLock的优缺点。答案:synchronized:Java内置关键字,自动释放锁(同步块/方法结束时),支持可重入,锁的获取和释放是隐式的。但锁的粒度固定,无法中断等待锁的线程,不支持条件变量(需结合wait/notify)。ReentrantLock:显式锁(实现Lock接口),支持可重入、可中断(lockInterruptibly())、尝试获取锁(tryLock())、多个条件变量(Condition),锁的粒度更灵活。但需手动释放锁(finally块中调用unlock()),可能因忘记释放导致死锁。4.解释Java内存模型(JMM)中的“可见性”问题,并说明如何解决。答案:可见性问题指多个线程访问共享变量时,一个线程对变量的修改,其他线程可能无法及时看到。原因是各线程有自己的工作内存(缓存),共享变量的修改会先写入工作内存,再同步到主内存,其他线程的工作内存可能未及时更新。解决方法:使用volatile关键字(保证可见性和禁止指令重排)、synchronized或Lock(保证原子性和可见性)、使用并发工具类(如AtomicXXX)。5.简述Java异常处理的最佳实践(至少列出3点)。答案:捕获具体异常而非通用Exception,避免隐藏潜在错误;避免空的catch块(如catch(Exceptione){}),至少记录日志;使用try-with-resources处理资源(如IO流、数据库连接),确保资源自动关闭;自定义业务异常时,继承RuntimeException或Exception,明确异常场景;不要在finally块中使用return,可能覆盖try/catch中的返回值。四、编程题(共30分)1.(10分)实现一个线程安全的日志工具类,要求:使用单例模式,确保全局唯一实例;提供log(Stringmessage)方法,将日志信息异步写入文件(使用阻塞队列实现生产者-消费者模型);日志格式为“[时间戳]日志内容”(时间戳格式:yyyy-MM-ddHH:mm:ss)。答案示例:```javaimportjava.io.BufferedWriter;importjava.io.FileWriter;importjava.io.IOException;importjava.time.LocalDateTime;importjava.time.format.DateTimeFormatter;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.LinkedBlockingQueue;publicclassThreadSafeLogger{//单例模式:静态内部类实现懒加载,线程安全privatestaticclassHolder{staticfinalThreadSafeLoggerINSTANCE=newThreadSafeLogger();}publicstaticThreadSafeLoggergetInstance(){returnHolder.INSTANCE;}privatefinalBlockingQueue<String>logQueue=newLinkedBlockingQueue<>();privatefinalDateTimeFormatterformatter=DateTimeFormatter.ofPattern("yyyy-MM-ddHH:mm:ss");privatevolatilebooleanisRunning=true;privateThreadSafeLogger(){//启动消费者线程newThread(this::consumeLogs).start();}//生产者:将日志加入队列publicvoidlog(Stringmessage){StringlogEntry="["+formatter.format(LocalDateTime.now())+"]"+message;try{logQueue.put(logEntry);//阻塞直到队列有空间}catch(InterruptedExceptione){Thread.currentThread().interrupt();thrownewRuntimeException("日志入队失败",e);}}//消费者:从队列取出日志并写入文件privatevoidconsumeLogs(){try(BufferedWriterwriter=newBufferedWriter(newFileWriter("app.log",true))){while(isRunning||!logQueue.isEmpty()){StringlogEntry=logQueue.poll();//非阻塞获取,若队列为空返回nullif(logEntry!=null){writer.write(logEntry);writer.newLine();writer.flush();//及时刷新缓冲区}else{//队列为空时短暂休眠,避免空转Thread.sleep(100);}}}catch(IOException|InterruptedExceptione){e.printStackTrace();}}//关闭日志工具(可选)publicvoidshutdown(){isRunning=false;}}```2.(10分)设计一个学生信息管理系统,要求:使用集合存储学生对象(Student类包含id、name、age属性);实现添加、删除(根据id)、修改(根据id更新name或age)、查询(根据id返回学生)功能;处理并发修改异常(如多线程同时修改集合时可能出现的ConcurrentModificationException)。答案示例:```javaimportjava.util.Map;importjava.util.concurrent.ConcurrentHashMap;classStudent{privatefinalStringid;privateStringname;privateintage;publicStudent(Stringid,Stringname,intage){this.id=id;=name;this.age=age;}//getter和setter省略}publicclassStudentManager{//使用ConcurrentHashMap保证线程安全,key为学生idprivatefinalMap<String,Student>students=newConcurrentHashMap<>();//添加学生publicbooleanaddStudent(Studentstudent){returnstudents.putIfAbsent(student.getId(),student)==null;}//根据id删除学生publicbooleanremoveStudent(Stringid){returnstudents.remove(id)!=null;}//根据id修改学生信息(支持修改name或age)publicbooleanupdateStudent(Stringid,StringnewName,IntegernewAge){returnputeIfPresent(id,(key,student)->{if(newName!=null)student.setName(newName);if(newAge!=null)student.setAge(newAge);returnstudent;})!=null;}//根据id查询学生publicStudentqueryStudent(Stringid){returnstudents.get(id);}}```3.(10分)编写一个文件加密工具类,要求:使用AES算法(密钥长度128位)对文件进行加密/解密;使用NIO的FileChannel实现大文件处理(避免内存溢出);处理加密/解密过程中的异常(如文件不存在、密钥错误)。答案示例(关键代码):```javaimportjavax.crypto.;importjavax.crypto.spec.GCMParameterSpec;importjava.io.IOException;importjava.nio.ByteBuffer;importjava.nio.channels.FileChannel;importjava.nio.file.Paths;importjava.nio.file.StandardOpenOption;importjava.security.SecureRandom;importjava.util.Arrays;publicclassFileEncryptor{privatestaticfinalintAES_KEY_SIZE=128;privatestaticfinalintGCM_IV_LENGTH=12;//GCM推荐IV长度12字节privatestaticfinalintGCM_TAG_LENGTH=16;//认证标签长度16字节//提供AES密钥publicstaticSecretKeygenerateAESKey()throwsException{KeyGeneratorkeyGen=KeyGenerator.getInstance("AES");keyGen.init(AES_KEY_SIZE);returnkeyGen.generateKey();}//加密文件publicvoidencrypt(StringsourcePath,StringdestPath,SecretKeykey)throwsException{try(FileChannelinChannel=FileChannel.open(Paths.get(sourcePath),StandardOpenOption.READ);FileChanneloutChannel=FileChannel.open(Paths.get(destPath),StandardOpenOption.WRITE,StandardOpenOption.CREATE)){//提供随机IV(初始化向量)byte[]iv=newbyte[GCM_IV_LENGTH];newSecureRandom().nextBytes(iv);outChannel.write(ByteBuffer.wrap(iv));//将IV写入目标文件头部//初始化AES-GCM加密器Ciphercipher=Cipher.getInstance("AES/GCM/NoPadding");GCMParameterSp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 面向碳中和的校园AI能源消耗低碳预测模型构建与策略研究课题报告教学研究课题报告
- 2026年航空公司行政支持岗位面试题及答案
- 2026年资产减值测试与处置决策
- 2026年IT企业商务拓展经理招聘的考核标准与问题解析
- 老年人日常生活能力恢复策略-洞察及研究
- 干细胞衰老与肿瘤-洞察及研究
- 面源污染风险评价-洞察及研究
- 未来五年农作物收割服务企业县域市场拓展与下沉战略分析研究报告
- 未来五年人收养服务企业ESG实践与创新战略分析研究报告
- 未来五年人造奶油(人造黄油)企业数字化转型与智慧升级战略分析研究报告
- 北京通州产业服务有限公司招聘参考题库必考题
- 催收管理制度及流程规范
- 交通安全志愿者培训课件
- 化工防止静电安全培训课件
- 护理不良事件根本原因分析
- AI药物研发中的伦理风险防控
- 社会心理学考试题及答案
- 出铁厂铁沟浇注施工方案
- 现代企业管理体系架构及运作模式
- 2025年江苏省泰州市保安员理论考试题库及答案(完整)
- 公司酶制剂发酵工工艺技术规程
评论
0/150
提交评论