Java 常见笔试真题及详细答案(实战版)_第1页
Java 常见笔试真题及详细答案(实战版)_第2页
Java 常见笔试真题及详细答案(实战版)_第3页
Java 常见笔试真题及详细答案(实战版)_第4页
Java 常见笔试真题及详细答案(实战版)_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

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

文档简介

Java常见笔试真题及详细答案(实战版)本套题目精选互联网、传统软件企业高频Java笔试题,覆盖Java基础、面向对象、集合框架、异常、多线程、JVM、基础算法、数据库交互等核心考点,答案贴合开发实战,解析通俗易懂,适合校招、社招笔试刷题复习。一、Java基础语法真题1、String、StringBuilder、StringBuffer的区别?参考答案:1.可变性:String是不可变字符序列,每次赋值、拼接都会生成新的字符串对象;StringBuilder和StringBuffer是可变字符序列,修改内容不会新建对象。2.线程安全:StringBuffer方法加了synchronized锁,线程安全,适合多线程场景;StringBuilder无锁,线程不安全,适合单线程场景。3.性能:单线程下StringBuilder效率最高,StringBuffer次之,String拼接效率最低。4.使用场景:少量字符串操作用String;单线程大量拼接用StringBuilder;多线程大量拼接用StringBuffer。2、==和equals()的区别?参考答案:1.==是运算符:基本数据类型比较数值是否相等;引用数据类型比较对象内存地址是否相同,即是否为同一个对象。2.equals()是Object类方法:默认逻辑和==一致,比较对象地址;但String、Integer等包装类重写了该方法,重写后只比较对象内容是否相等,不比较地址。核心总结:基本类型只用==;字符串、包装类对比内容,必须用equals()。3、int和Integer的区别?参考答案:1.类型不同:int是Java基本数据类型,直接存储数值;Integer是int的包装类,属于引用类型,存储对象地址。2.默认值不同:int默认值为0;Integer默认值为null。3.存储方式:int变量直接在栈内存赋值;Integer对象存于堆内存,栈中仅保留引用地址。4.缓存机制:Integer存在-128~127缓存区间,该区间内相同数值的Integer对象复用,地址一致;超出区间会新建对象;int无缓存机制。5.泛型支持:泛型集合(List、Map)只能存包装类,不能存储基本类型,即只能用Integer,不能用int。4、Java自动装箱与拆箱是什么?参考答案:装箱:基本类型自动转换为对应的包装类对象,例如Integera=10;编译器自动执行Integera=Integer.valueOf(10)。拆箱:包装类对象自动转换为对应的基本类型,例如intb=a;编译器自动执行intb=Value()。日常开发中基本类型和包装类的直接赋值、运算,都会触发自动装箱拆箱,是JDK5新增特性。二、面向对象OOP真题1、面向对象的四大特性及含义?参考答案:1.封装:将类的属性私有化,通过public方法对外提供访问、修改入口,隐藏内部实现细节,保证数据安全性,降低代码耦合度。2.继承:子类继承父类的属性和方法,实现代码复用,减少重复代码,同时子类可拓展自有功能。Java仅支持单继承,支持多接口实现。3.多态:同一行为,不同对象有不同实现方式。分为编译时多态(方法重载)和运行时多态(方法重写),核心是父类引用指向子类对象。4.抽象:抽取事物共性特征,忽略细节。通过抽象类、接口实现,定义规范标准,强制子类实现对应功能。2、重载和重写的区别?参考答案:1.定义不同:重载是同一个类中,多个方法名相同、参数列表不同(参数个数、类型、顺序不同);重写是子类对父类非私有、非final、非static方法的重新实现。2.权限范围:重载发生在本类;重写发生在父子类之间。3.返回值:重载返回值可随意修改;重写返回值范围必须小于等于父类方法。4.访问修饰符:重载无限制;重写修饰符权限必须大于等于父类(父类protected,子类可public/protected)。5.异常:重载异常无限制;重写抛出的异常范围必须小于等于父类。6.多态类型:重载是编译时多态;重写是运行时多态。3、抽象类和接口的区别?参考答案:1.继承规则:类只能继承一个抽象类;类可以实现多个接口,解决单继承局限。2.成员变量:抽象类可包含普通变量、常量;接口默认只能是publicstaticfinal常量(JDK8之前)。3.方法特性:抽象类可包含普通方法、构造方法、静态方法、抽象方法;JDK8前接口只有抽象方法,JDK8新增默认方法、静态方法,JDK9新增私有方法。4.构造方法:抽象类有构造方法,用于子类初始化;接口无构造方法,不能实例化。5.设计思想:抽象类是模板设计,描述事物共性;接口是行为规范,描述事物具备的能力。4、final、finally、finalize的区别?参考答案:1.final:修饰符。修饰变量:变量不可二次赋值(常量);修饰方法:方法不可被重写;修饰类:类不可被继承。2.finally:异常处理关键字。搭配try-catch使用,代码块无论是否异常都会执行(除JVM退出外),常用于释放资源、关闭流。3.finalize:Object类废弃方法。JVM垃圾回收前会调用该方法,用于对象资源回收,不确定性极高,开发中完全不推荐使用,JDK9已标记废弃。三、集合框架真题1、ArrayList和LinkedList的区别?参考答案:1.底层结构:ArrayList基于动态数组;LinkedList基于双向链表。2.查询效率:ArrayList支持随机访问,通过下标查询速度极快;LinkedList只能从头节点遍历查询,效率低。3.增删效率:ArrayList增删元素会触发数组扩容、元素移位,效率低;LinkedList仅修改节点指针,无需移位,增删效率高。4.内存占用:ArrayList会预留冗余容量,存在内存浪费;LinkedList每个节点存储数据和前后指针,单个元素内存占用更大。5.线程安全:两者均线程不安全。使用场景:高频查询、少量增删用ArrayList;高频增删、少量查询用LinkedList。2、HashMap的底层原理?JDK1.7与JDK1.8区别?参考答案:底层核心原理:HashMap基于「数组+链表+红黑树」实现,通过hash算法计算元素下标,解决哈希冲突,实现键值对高效存储与查询。JDK1.7版本:底层为数组+单向链表,采用头插法插入元素,哈希冲突严重时链表过长,查询效率极低;默认容量16,负载因子0.75。JDK1.8优化:1.结构升级:数组+单向链表+红黑树,链表长度超过8、数组容量大于64时,链表转为红黑树,查询时间复杂度从O(n)降至O(logn)。2.插入方式:改为尾插法,避免JDK1.7头插法导致的循环链表死循环问题。3.哈希算法优化:简化扰动算法,减少哈希碰撞概率。4.扩容优化:新增高低位扩容机制,无需重新计算哈希值。3、HashMap和HashTable的区别?参考答案:1.线程安全:HashTable所有方法加synchronized锁,线程安全;HashMap线程不安全。2.null支持:HashMap允许key、value为null(key仅一个null,value可多个null);HashTable不允许key、value为null,直接报错空指针。3.效率:HashTable加锁导致并发效率极低;HashMap无锁,单线程效率高。4.初始容量:HashTable默认初始容量11;HashMap默认16。5.扩容规则:HashTable扩容为原容量*2+1;HashMap扩容为原容量2倍。补充:并发场景推荐使用ConcurrentHashMap,替代低效的HashTable。4、ConcurrentHashMap线程安全原理?参考答案:JDK1.8版本放弃分段锁机制,采用CAS+synchronized+红黑树/链表实现线程安全:1.无冲突时,通过CAS无锁操作插入数据,效率高;2.发生哈希冲突时,对当前数组桶位的头节点加synchronized锁,仅锁定单个桶位,不会锁定整个数组,并发粒度极小;3.结合红黑树优化查询效率,兼顾线程安全和高性能,是并发场景首选的键值对集合。四、异常体系真题1、CheckedException和RuntimeException的区别?参考答案:1.运行时异常(RuntimeException):编译不报错,运行时才抛出,属于程序逻辑错误,可规避。例如空指针、数组越界、类型转换异常。无需主动捕获或声明抛出。2.编译异常(CheckedException):编译阶段强制校验,必须通过try-catch捕获或throws声明抛出,否则编译失败。例如IO异常、SQL异常、文件不存在异常。核心区别:运行时异常是代码bug,需要改代码解决;编译异常是外部环境问题,需要主动处理规避。2、try-catch-finally中return的执行顺序?参考答案:1.执行try代码块逻辑,遇到return时,先缓存返回值,不会直接返回;2.执行finally代码块所有逻辑;3.finally执行完毕后,返回之前缓存的return值;4.特殊情况:如果finally中存在return、System.exit(0),会直接终止方法或JVM,try中的return失效。实战规范:finally中禁止写return、抛出异常,避免覆盖正常逻辑结果。五、多线程真题1、创建线程的几种方式?参考答案:1.继承Thread类:重写run()方法,调用start()启动线程;缺点是单继承限制,无法再继承其他类。2.实现Runnable接口:重写run()方法,传入Thread对象启动;无继承限制,无返回值,适合无结果的异步任务。3.实现Callable接口:重写call()方法,有返回值、可抛出异常,搭配FutureTask使用,可获取线程执行结果。4.线程池创建:通过Executors、ThreadPoolExecutor创建线程,统一管理线程,避免频繁创建销毁线程的资源消耗,企业开发主流方式。2、synchronized和Lock的区别?参考答案:1.实现方式:synchronized是JVM原生内置锁,底层由虚拟机实现;Lock是Java代码层面的锁(接口),底层通过AQS队列实现。2.锁粒度:synchronized修饰方法、代码块,锁粒度固定;Lock可精准控制锁的获取和释放,粒度更灵活。3.阻塞特性:synchronized阻塞不可中断,线程等待锁时只能一直等待;Lock可设置超时、可中断等待。4.锁类型:synchronized是可重入、不公平锁;ReentrantLock支持可重入、可公平、可不公平,可自由配置。5.唤醒机制:synchronized随机唤醒一个等待线程;Lock可精准唤醒指定线程。6.异常释放:synchronized异常自动释放锁;Lock必须手动在finally中解锁,否则会死锁。3、volatile关键字的作用?参考答案:volatile是轻量级同步关键字,核心两大作用:1.保证可见性:一个线程修改变量值,立即刷新到主内存,其他线程可实时读取最新值,避免缓存不一致问题。2.禁止指令重排:防止JVM、CPU为优化效率打乱代码执行顺序,解决多线程指令重排导致的逻辑错乱。注意:volatile不保证原子性,无法替代锁,复合操作(i++、赋值运算)依然存在线程安全问题。六、JVM核心真题1、JVM内存区域划分?参考答案:JVM运行时数据区分为5个核心区域:1.程序计数器:线程私有,记录当前线程执行的字节码行号,无内存溢出,是唯一没有OOM的区域。2.虚拟机栈:线程私有,存储局部变量、方法栈帧、操作数栈,方法执行完毕自动释放,栈深过大会抛出栈溢出异常。3.本地方法栈:线程私有,为Native本地方法服务,功能和虚拟机栈类似。4.堆内存:线程共享,所有对象、数组均在堆中分配,是GC垃圾回收的主要区域,容易发生OOM内存溢出。分为新生代、老年代。5.方法区:线程共享,存储类信息、常量、静态变量、即时编译代码,JDK1.8后改为元空间,使用本地内存,不再占用堆内存。2、GC垃圾回收的常用算法?参考答案:1.标记清除算法:先标记无用对象,再统一清除;优点简单,缺点产生大量内存碎片。2.复制算法:将存活对象复制到新内存区域,清空原区域;无内存碎片,适合新生代存活对象少的场景,缺点浪费一半内存。3.标记整理算法:标记存活对象后,向内存一端整理压缩,清除末端垃圾;无碎片、不浪费内存,适合老年代存活对象多的场景,效率偏低。4.分代收集算法:企业主流算法,新生代采用复制算法,老年代采用标记清除+标记整理结合,兼顾效率和内存利用率。3、MinorGC、MajorGC、FullGC的区别?参考答案:1.MinorGC:新生代垃圾回收,频率高、速度快,触发频繁,对系统影响小。2.MajorGC:老年代垃圾回收,频率低、速度慢,耗时远高于MinorGC。3.FullGC:整堆回收,回收新生代+老年代+元空间,会暂停所有用户线程,系统卡顿严重,开发中需尽量避免。七、编程基础真题(代码简答)1、手写单例模式(饿汉、懒汉安全版)参考答案:饿汉式(线程安全、简单常用)java

publicclassSingleton{

//类加载时直接初始化

privatestaticfinalSingletoninstance=newSingleton();

//私有构造方法,禁止外部实例化

privateSingleton(){}

//对外获取实例

publicstaticSingletongetInstance(){

returninstance;

}

}懒汉式(双重检查锁、线程安全、高效)java

publicclassSingleton{

//volatile禁止指令重排,避免半初始化对象

privatestaticvolatileSingletoninstance;

privateSingleton(){}

publicstaticSingletongetInstance(){

温馨提示

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

评论

0/150

提交评论