2025年java技术笔试试题及答案_第1页
2025年java技术笔试试题及答案_第2页
2025年java技术笔试试题及答案_第3页
2025年java技术笔试试题及答案_第4页
2025年java技术笔试试题及答案_第5页
已阅读5页,还剩13页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

2025年java技术笔试试题及答案一、选择题(每题2分,共20分)1.关于Java泛型的类型擦除机制,以下描述错误的是()A.泛型信息仅存在于编译期,运行时会被擦除B.无法在运行时通过反射获取泛型参数的具体类型C.String和List<String>在运行时的Class对象相同D.泛型类不能直接实例化基本类型(如int)的数组答案:B(反射可以通过Type接口获取部分泛型信息,如Method的getGenericParameterTypes())2.以下代码执行后,输出结果是()```javaStrings1="java";Strings2=newString("java");Strings3=ern();System.out.println(s1==s3);```A.trueB.falseC.编译错误D.运行时异常答案:A(intern()方法会将字符串实例的内容添加到字符串常量池,若已存在则返回常量池引用,s1指向常量池,s3与s1指向同一对象)3.关于Java多线程的状态转换,以下不可能发生的是()A.RUNNABLE→BLOCKED(等待锁)B.TIMED_WAITING→RUNNABLE(超时唤醒)C.WAITING→TERMINATED(其他线程调用interrupt())D.NEW→RUNNABLE(调用start())答案:C(WAITING状态的线程被唤醒后会进入RUNNABLE,TERMINATED是线程结束状态,无法从WAITING直接转换)4.以下集合类中,线程安全且基于数组实现的是()A.ArrayListB.VectorC.CopyOnWriteArrayListD.LinkedList答案:B(Vector是线程安全的动态数组,使用synchronized方法;CopyOnWriteArrayList基于数组但通过复制实现线程安全,非synchronized)5.Java21中引入的虚拟线程(VirtualThreads),其核心特点不包括()A.与操作系统线程(平台线程)一一对应B.由JVM调度,而非操作系统内核C.适合处理大量短时间阻塞的任务D.内存占用远低于平台线程答案:A(虚拟线程是M:N映射到平台线程,非一一对应)6.以下关于StreamAPI的说法,正确的是()A.中间操作(intermediateoperations)会立即执行数据处理B.终端操作(terminaloperations)只能执行一次C.parallelStream()一定比stream()效率更高D.collect(Collectors.toList())返回的List是不可变的答案:B(Stream是惰性执行的,中间操作返回新的Stream,终端操作触发执行且只能调用一次)7.关于异常处理,以下代码的输出是()```javatry{intx=1/0;}catch(ArithmeticExceptione){System.out.print("A");}catch(Exceptione){System.out.print("B");}finally{System.out.print("C");}```A.ACB.ABCC.BCD.C答案:A(ArithmeticException是Exception的子类,优先匹配第一个catch块,finally必执行)8.若要实现一个线程安全的计数器,使用AtomicInteger比synchronized更优的主要原因是()A.AtomicInteger支持更大的数值范围B.基于CAS(Compare-And-Swap)无锁机制,减少上下文切换C.AtomicInteger可以自动处理溢出D.synchronized不支持原子操作答案:B(CAS通过硬件指令实现原子性,避免了锁的竞争和线程阻塞)9.以下关于JVM垃圾收集器的描述,错误的是()A.G1收集器适用于大内存场景,目标是降低停顿时间B.ZGC是低延迟收集器,支持TB级内存C.Serial收集器是单线程的,仅适用于客户端模式D.CMS收集器采用“标记-整理”算法,避免内存碎片答案:D(CMS使用“标记-清除”算法,会产生内存碎片;G1和ZGC使用“标记-整理”或类似算法)10.关于接口和抽象类的区别,以下说法正确的是()A.抽象类可以有构造方法,接口不能有B.接口可以有成员变量(非静态),抽象类不能C.一个类只能继承一个抽象类,但可以实现多个接口D.Java8后接口不能有默认方法(defaultmethod)答案:C(A错误,接口在Java8后可以有静态方法和默认方法的实现,但无构造方法;B错误,接口的成员变量默认是publicstaticfinal;D错误,Java8支持默认方法)二、填空题(每空2分,共10分)1.Java中,线程的优先级范围是______,默认优先级为______。答案:1-10;52.ConcurrentHashMap在Java8中放弃了分段锁(Segment),改为使用______和______机制实现线程安全。答案:synchronized;CAS3.JavaIO中,BufferedInputStream的默认缓冲区大小是______字节;NIO中,Channel的读写操作是______(阻塞/非阻塞)的。答案:8192;非阻塞(注:Channel本身支持非阻塞,但具体是否阻塞取决于使用方式,如FileChannel是阻塞的,SocketChannel可配置为非阻塞)4.Lambda表达式的本质是______,其底层通过______技术提供调用类。答案:函数式接口的实例;invokedynamic(动态调用)三、简答题(每题6分,共30分)1.简述Java中深拷贝(DeepCopy)和浅拷贝(ShallowCopy)的区别,并说明如何实现深拷贝。答案:浅拷贝仅复制对象本身及基本类型字段,引用类型字段指向原对象的同一实例;深拷贝会递归复制所有引用类型字段,提供完全独立的对象。实现深拷贝的方法:重写clone()方法并递归调用clone();使用序列化(Serializable/Externalizable)和反序列化;使用第三方库(如ApacheCommonsLang的SerializationUtils)。2.对比synchronized关键字和ReentrantLock的适用场景。答案:synchronized是JVM内置锁,自动释放(作用域结束或异常),支持锁升级(偏向锁→轻量级锁→重量级锁),适合简单同步场景;ReentrantLock是显式锁(需手动unlock()),支持可中断锁、超时获取锁、公平/非公平锁、条件变量(Condition),适合复杂同步逻辑(如多个等待条件的场景)。3.说明Java内存模型(JMM)中happens-before原则的作用,并列举至少3条具体规则。答案:happens-before原则定义了多线程环境下变量可见性的顺序,确保操作的内存可见性。具体规则:程序顺序规则(单线程内操作按顺序可见)、volatile变量规则(对volatile变量的写先于读)、锁规则(解锁先于加锁)、传递性规则(Ahappens-beforeB,Bhappens-beforeC→Ahappens-beforeC)、线程启动规则(start()先于线程内所有操作)、线程终止规则(线程内操作先于join()返回)。4.描述Java17中引入的密封类(SealedClasses)的作用及使用方式。答案:密封类限制其他类对其的继承或实现,通过sealed关键字声明,并使用permits子句指定允许的子类。作用是控制类型层次结构,提高代码可维护性(如枚举扩展场景)。示例:```javapublicsealedclassShapepermitsCircle,Rectangle{}publicfinalclassCircleextendsShape{}publicnon-sealedclassRectangleextendsShape{}//允许进一步继承```5.分析ArrayList和LinkedList在随机访问、插入/删除操作上的性能差异及原因。答案:ArrayList基于动态数组,随机访问(get/set)时间复杂度O(1),但插入/删除(非末尾)需移动元素,时间复杂度O(n);LinkedList基于双向链表,随机访问需遍历节点(O(n)),但插入/删除(已知节点位置)只需调整指针(O(1))。实际中,ArrayList的数组连续内存特性在缓存友好性上更优,小数据量时插入/删除性能可能优于LinkedList。四、编程题(共40分)1.(10分)实现一个方法,判断一个字符串是否是有效的括号字符串。有效条件:所有括号正确闭合(如"()[]{}"有效,"([)]"无效),支持括号类型包括()、[]、{}。答案:```javaimportjava.util.Stack;publicstaticbooleanisValidParentheses(Strings){if(s==null||s.length()%2!=0)returnfalse;Stack<Character>stack=newStack<>();for(charc:s.toCharArray()){if(c=='(')stack.push(')');elseif(c=='[')stack.push(']');elseif(c=='{')stack.push('}');else{if(stack.isEmpty()||stack.pop()!=c)returnfalse;}}returnstack.isEmpty();}```2.(15分)使用Java多线程实现一个生产者-消费者模型,要求:生产者提供0-99的整数,消费者打印整数;使用阻塞队列(BlockingQueue)实现线程间通信;生产者和消费者各1个线程。答案:```javaimportjava.util.concurrent.BlockingQueue;importjava.util.concurrent.LinkedBlockingQueue;publicclassProducerConsumer{privatestaticfinalBlockingQueue<Integer>queue=newLinkedBlockingQueue<>(10);publicstaticvoidmain(String[]args){Threadproducer=newThread(()->{try{for(inti=0;i<100;i++){queue.put(i);System.out.println("生产:"+i);}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}});Threadconsumer=newThread(()->{try{while(true){Integernum=queue.take();System.out.println("消费:"+num);if(num==99)break;//终止条件}}catch(InterruptedExceptione){Thread.currentThread().interrupt();}});producer.start();consumer.start();}}```3.(15分)设计一个线程安全的LRU(最近最少使用)缓存,要求支持put和get操作,时间复杂度O(1)。答案:```javaimportjava.util.HashMap;importjava.util.Map;publicclassLRUCache{privatestaticclassNode{intkey,value;Nodeprev,next;Node(intk,intv){key=k;value=v;}}privatefinalMap<Integer,Node>map;privatefinalNodehead,tail;privatefinalintcapacity;publicLRUCache(intcapacity){this.capacity=capacity;map=newHashMap<>();head=newNode(0,0);tail=newNode(0,0);head.next=tail;tail.prev=head;}publicintget(intkey){Nodenode=map.get(key);if(node==null)return-1;moveToHead(node);//访问后移到头部(最近使用)returnnode.value;}publicvoidput(intkey,intvalue){Nodenode=map.get(key);if(node!=null){node.value=value;moveToHead(node);}else{node=newNode(key,

温馨提示

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

评论

0/150

提交评论