版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
115道Java高频面试题及详细答案(实战版)一、Java基础语法(1-20题)1、Java的基本数据类型有哪些?区别是什么?Java有8种基本数据类型,分为四类:整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)浮点型:float(4字节)、double(8字节)字符型:char(2字节)布尔型:boolean(1字节,只有true/false)核心区别:基本类型直接存储数值,存放在栈内存;默认有初始值,不需要new创建,效率高、占用内存小。对应的包装类是引用类型,存储对象地址,存放在堆内存。2、==和equals的区别?==是运算符,可用于基本类型和引用类型。基本类型比较数值是否相等,引用类型比较对象的内存地址是否相同。equals是Object类的方法,默认比较对象地址,大部分常用类(String、Integer)重写了该方法,用于比较对象的内容是否相等。日常开发中,比较字符串、对象内容一律用equals。3、String、StringBuilder、StringBuffer的区别?String:不可变字符串,每次修改都会生成新对象,适合少量字符串操作,线程安全。StringBuilder:可变字符串,效率高,非线程安全,单线程大量字符串拼接首选。StringBuffer:可变字符串,加了synchronized锁,线程安全,效率低,适合多线程字符串操作。4、final、finally、finalize的区别?final:修饰符,修饰变量不可修改、修饰方法不可重写、修饰类不可继承。finally:异常处理关键字,搭配try-catch使用,代码块无论是否异常都会执行,常用于释放资源。finalize:Object类的废弃方法,JVM垃圾回收前调用,无法保证执行时机,现在基本不用。5、int和Integer的区别?int是基本数据类型,默认值0,直接存数值;Integer是int的包装类,属于引用类型,默认值null。Integer有缓存机制,-128~127范围内的数值会复用缓存对象,超出范围会新建对象,这也是这个区间内Integer对象==比较为true,超出为false的原因。6、自动装箱和拆箱是什么?装箱:基本类型自动转为包装类对象,比如int转Integer。拆箱:包装类对象自动转为基本类型,比如Integer转int。JDK5之后自动实现,无需手动转换,底层依靠valueOf和intValue等方法完成。7、Java中的异常分类?分为两大类:Error和Exception。Error:系统级严重错误,比如OOM、栈溢出,程序无法处理,无需捕获。Exception:程序可处理异常,分为编译时异常(受检异常,必须捕获或抛出,如IO异常)和运行时异常(非受检异常,如空指针、数组越界)。8、try-catch-finally中return的执行顺序?如果try里有return,会先执行return语句的取值,暂存结果,再执行finally代码块,最后返回暂存的结果。finally里的return会覆盖try中的返回值,开发中禁止在finally中写return。9、static关键字的作用?static可以修饰变量、方法、代码块、内部类。修饰变量:属于类,所有对象共享,类加载时初始化,可通过类名直接调用。修饰方法:静态方法,只能访问静态成员,不能使用this/super,无需创建对象即可调用。修饰代码块:静态代码块,类加载时只执行一次,用于初始化静态资源。10、this和super的区别?this:代表当前对象实例,可调用本类属性、方法、构造器,区分成员变量和局部变量。super:代表父类对象实例,可调用父类属性、方法、构造器,用于子类访问父类资源。两者调用构造器时,都必须放在代码第一行,且不能同时使用。11、Java的运算符优先级?优先级从高到低:括号>单目运算>乘除取模>加减>移位>比较运算>逻辑运算>赋值运算。日常开发建议用括号控制优先级,避免出错。12、break、continue、return的区别?break:跳出当前循环或switch语句,终止循环。continue:跳过本次循环,直接进入下一次循环。return:结束当前方法,返回结果,终止方法执行。13、数组和集合的区别?数组:长度固定,可存基本类型和引用类型,效率高,功能单一。集合:长度可变,只能存引用类型,提供增删改查、遍历、排序等丰富方法,适配动态数据场景。14、泛型的作用是什么?编译期类型校验,避免类型转换异常;省去强制类型转换代码;让代码更通用、复用性更强,保证程序类型安全。15、可变参数的用法和注意事项?格式:方法参数类型...参数名,可接收任意多个对应类型参数。可变参数必须放在参数列表最后,一个方法只能有一个可变参数,底层是数组实现。16、枚举的特点和使用场景?枚举是特殊类,常量固定、线程安全、单例。用于定义固定常量,比如状态码、性别、订单状态、权限类型,避免魔法值,提升代码可读性。17、接口和抽象类的基础区别?抽象类:有构造方法,可包含普通方法、静态方法、抽象方法,成员变量可自定义,单继承。接口:无构造方法,JDK8前只有抽象方法,后续支持默认、静态、私有方法,变量默认是常量,多实现。18、位运算的常见使用场景?与、或、异或、移位运算,效率极高。常用于权限校验、状态标记、快速乘除、HashMap底层哈希计算、奇偶判断。19、Java中的注释类型?单行注释//、多行注释/**/、文档注释/***/。文档注释可生成API文档,用于类、方法、参数说明,规范项目代码。20、标识符的命名规范?只能由字母、数字、下划线、美元符组成,不能以数字开头,不能使用关键字。类名大驼峰、方法/变量小驼峰、常量全大写下划线分隔、包名全小写。二、面向对象OOP(21-40题)21、面向对象的四大特性?封装、继承、多态、抽象。封装:隐藏对象内部细节,对外提供公共访问方式,保证数据安全。继承:子类复用父类代码,实现代码复用,降低冗余。多态:同一行为不同实现,分为编译多态(重载)、运行多态(重写),提升代码扩展性。抽象:抽取事物核心特征,忽略次要细节,分为抽象类和接口,规范代码结构。22、重载和重写的区别?重载:发生在同一个类中,方法名相同,参数列表不同(个数、类型、顺序),返回值可不同,编译期绑定。重写:发生在父子类中,方法名、参数列表、返回值必须一致,权限大于等于父类,不能抛出更宽泛异常,运行期绑定。23、抽象类能被实例化吗?有构造方法吗?抽象类不能直接new实例化,但有构造方法,用于子类实例化时初始化父类成员。抽象类可以没有抽象方法,有抽象方法的类必须是抽象类。24、接口可以有构造方法吗?接口没有构造方法,接口不能实例化。接口的变量默认是publicstaticfinal常量,方法默认权限为public。25、为什么接口只能单继承?接口可以多实现?类单继承是为了避免多继承带来的方法冲突、钻石问题;接口多实现,因为接口方法默认无实现,不存在冲突问题,能拓展类的功能。26、什么是钻石问题?多个父类存在同名方法,子类继承后无法区分调用哪个父类方法,造成逻辑冲突。Java通过类单继承、接口无实现方法规避该问题。27、访问修饰符的权限范围?public(公共):所有类可访问;protected(受保护):本类、同包、子类可访问;default(默认):本类、同包可访问;private(私有):仅本类可访问。权限从大到小依次递减。28、对象的创建过程?1、类加载检查,加载对应class文件;2、分配堆内存空间;3、成员变量默认初始化;4、代码块初始化;5、构造方法初始化;6、返回对象内存地址。29、构造方法的特点?方法名和类名一致,无返回值,创建对象时自动调用,可重载。如果类没有自定义构造方法,编译器会自动生成无参构造,自定义后默认无参构造失效。30、静态代码块、构造代码块、构造方法执行顺序?静态代码块(类加载时执行,仅一次)>构造代码块(每次创建对象执行)>构造方法(每次创建对象执行)。父子类场景:父类静态>子类静态>父类构造代码块>父类构造方法>子类构造代码块>子类构造方法。31、什么是内部类?有哪些分类?定义在类内部的类,分为成员内部类、静态内部类、局部内部类、匿名内部类。核心作用:封装专属内部逻辑、便捷实现回调、简化代码。32、匿名内部类的使用场景?快速创建接口、抽象类的实例,无需单独定义子类,适用于一次性使用的场景,比如线程创建、监听事件回调。33、Object类的常用方法有哪些?equals()、hashCode()、toString()、getClass()、clone()、wait()、notify()、notifyAll()、finalize()。34、hashCode和equals的关系?规范:两个对象equals相等,hashCode必须相等;hashCode相等,对象不一定equals相等。重写equals必须重写hashCode,否则会导致集合存储异常。35、深拷贝和浅拷贝的区别?浅拷贝:复制对象基本类型数值,引用类型只复制地址,新旧对象共享引用数据。深拷贝:完全复制所有数据,引用类型也新建对象,新旧对象数据完全独立,互不影响。36、封装的实际开发意义?屏蔽内部复杂逻辑,统一对外访问入口;保护核心数据,防止外部随意修改;降低代码耦合,方便后期维护迭代。37、继承的优缺点?优点:代码复用、减少冗余、便于功能拓展、多态实现基础。缺点:父子类耦合度高,父类修改会影响所有子类,破坏封装性。38、多态的实现条件?满足三个条件:存在继承关系、子类重写父类方法、父类引用指向子类对象。核心是运行时动态绑定方法。39、instanceof关键字的作用?判断对象是否是某个类或接口的实例,返回布尔值,常用于类型强转前的校验,避免类型转换异常。40、为什么Java是单线程继承多接口实现?单继承规避多继承的方法冲突和逻辑混乱;多接口实现可以突破单继承限制,灵活拓展类的功能,兼顾代码安全和扩展性。三、Java集合框架(41-60题)41、集合的核心架构?顶层两大接口:Collection(单列集合)、Map(双列键值对集合)。Collection分支:List(有序可重复)、Set(无序不可重复)、Queue(队列)。Map分支:HashMap、LinkedHashMap、TreeMap、HashTable等。42、ArrayList和LinkedList的区别?ArrayList:底层数组,查询快、增删慢,支持随机访问,线程不安全,适合查询遍历场景。LinkedList:底层双向链表,增删快、查询慢,不支持随机访问,适合频繁增删场景。43、ArrayList的扩容机制?初始容量10,JDK1.8首次扩容为原容量1.5倍,后续每次扩容均1.5倍。扩容时会新建数组,复制原数组元素,尾部插入效率高,中间插入需移动元素。44、Vector和ArrayList的区别?Vector线程安全(方法加锁),效率低,扩容2倍;ArrayList线程不安全,效率高,扩容1.5倍。Vector基本已被淘汰。45、HashSet的底层原理?HashSet底层基于HashMap实现,存储元素作为HashMap的key,value为固定空对象。依靠hashCode和equals方法去重,无序、不可重复,线程不安全。46、TreeSet的特点?底层基于TreeMap,可对元素自然排序或自定义排序,无序去重,线程不安全,适合需要排序的集合场景。47、HashMap的底层原理(JDK1.8)?底层数组+链表+红黑树。通过哈希算法计算索引存储键值对,哈希冲突时链表存储,链表长度≥8且数组容量≥64转为红黑树,优化查询效率;节点数≤6退化为链表。默认容量16,负载因子0.75,扩容2倍。48、HashMap为什么线程不安全?多线程put操作会导致数据覆盖、链表闭环、数据丢失;JDK1.7扩容存在死循环问题,1.8解决死循环但仍有数据覆盖问题,并发场景推荐ConcurrentHashMap。49、HashMap和HashTable的区别?HashMap线程不安全,允许key/value为null,效率高,初始容量16;HashTable线程安全(全局锁),不允许null值,效率极低,初始容量11,基本废弃。50、LinkedHashMap的特点?继承HashMap,底层维护双向链表,保留元素插入顺序,可实现LRU缓存淘汰策略,适合需要有序存储的键值对场景。51、ConcurrentHashMap底层原理?JDK1.8采用CAS+synchronized实现并发安全,锁粒度细化到链表/红黑树节点,不再分段锁。支持高并发读写,性能远优于HashTable,是并发场景首选Map。52、List、Set、Map的区别?List:有序可重复,可通过索引取值;Set:无序不可重复,无索引;Map:键值对存储,key唯一,value可重复。53、集合的遍历方式有哪些?普通for循环、增强for循环、迭代器Iterator、forEach流式遍历。迭代器支持遍历中删除元素,增强for循环遍历中删除会报异常。54、Iterator和ListIterator的区别?Iterator可遍历所有集合,仅支持向后遍历、删除元素;ListIterator仅支持List集合,可前后遍历、新增、修改元素,功能更丰富。55、什么是快速失败(fail-fast)?集合遍历过程中,检测到集合结构被修改(增删元素),立即抛出并发修改异常,避免数据不一致,是一种快速报错保护机制。56、什么是安全失败(fail-safe)?遍历并发集合时,基于原集合副本遍历,遍历中修改原集合不会报错,无需抛出异常,缺点是无法感知遍历过程中的数据变化。57、负载因子的作用?为什么是0.75?负载因子决定HashMap扩容时机,数值越大空间利用率越高,哈希冲突概率越高;0.75是空间利用率和查询效率的最优平衡点,兼顾两者性能。58、HashMap的key可以是null吗?value呢?key允许一个null值,存储在数组索引0位置;value可以多个null值。HashTablekey和value都不允许为null。59、TreeMap的排序规则?默认按照key自然排序(数值、字符串默认规则),也可自定义Comparator比较器实现自定义排序,key不能为null。60、Queue和Deque的区别?Queue是单向队列,先进先出;Deque是双向队列,可头尾操作,兼具队列和栈的特性,ArrayDeque是栈和队列的高效实现。四、多线程与并发(61-80题)61、进程和线程的区别?进程:系统资源分配的最小单位,独立内存,进程间互不干扰,开销大。线程:CPU调度的最小单位,共享进程内存资源,切换开销小,是进程的执行单元。62、Java创建线程的方式?四种方式:继承Thread类、实现Runnable接口、实现Callable接口(带返回值、可抛异常)、线程池创建。推荐后两种,避免单继承限制,便于资源复用。63、线程的生命周期?新建、就绪、运行、阻塞、死亡五大状态。阻塞分为等待阻塞、同步阻塞、超时阻塞,不同状态可相互切换。64、start()和run()的区别?start():开启新线程,由JVM调度执行run方法,只能调用一次。run():普通成员方法,直接调用不会开启新线程,同步执行,可多次调用。65、sleep、wait、yield的区别?sleep:线程休眠,不释放锁,指定时间后自动唤醒,Thread类方法。wait:线程等待,释放锁,需手动唤醒,Object类方法,只能在同步代码块使用。yield:让出CPU时间片,线程回到就绪状态,不释放锁,优先级不变。66、notify和notifyAll的区别?notify:随机唤醒一个等待线程;notifyAll:唤醒所有等待线程。开发中优先用notifyAll,避免线程永久阻塞。67、synchronized的原理和用法?内置锁,可修饰方法、代码块,保证原子性、可见性、有序性。底层依赖对象头的锁标记、监视器锁实现,锁粒度从偏向锁、轻量级锁、重量级锁逐步升级,不可降级。68、Lock和synchronized的区别?synchronized:内置锁,自动加锁释放锁,阻塞式等待,无法中断,适合少量并发场景。Lock:显式锁,手动加锁解锁,可中断等待、可超时、可公平锁,功能更灵活,适合高并发复杂场景。69、volatile关键字的作用?保证变量可见性、禁止指令重排,不保证原子性。适用于状态标记、单例模式双重校验锁场景,不能替代锁保证并发安全。70、什么是线程安全?线程不安全的原因?多线程操作共享数据,最终结果和单线程执行结果一致即为线程安全。不安全原因:共享变量、多线程交替执行、指令重排、缺乏同步控制。71、原子类的原理?java.util.concurrent.atomic包下原子类,基于CAS无锁机制实现,通过自旋重试保证数据原子性,效率高于锁机制,适合简单数值更新场景。72、CAS的原理和优缺点?CAS即比较并交换,读取旧值,更新前对比内存值,一致则更新,不一致则重试。优点:无锁、效率高;缺点:自旋消耗CPU、存在ABA问题、只能保证单个变量原子性。73、ABA问题怎么解决?使用带版本号的原子类AtomicStampedReference,每次修改更新版本号,对比数值+版本号,彻底规避ABA问题。74、线程池的核心参数?核心线程数、最大线程数、空闲超时时间、阻塞队列、线程工厂、拒绝策略。核心参数决定线程池的任务处理能力和并发性能。75、线程池的拒绝策略有哪些?四种默认策略:直接抛出异常、丢弃队列最久任务、丢弃当前任务、调用者线程执行。可自定义拒绝策略适配业务场景。76、为什么不推荐使用Executors创建线程池?Executors创建的线程池参数固定,可能出现无限创建线程、无界队列堆积任务,导致OOM、线程耗尽问题。生产环境必须手动自定义ThreadPoolExecutor。77、线程池的工作原理?接收任务后,先创建核心线程执行;核心线程满则放入阻塞队列;队列满则创建非核心线程;线程数达到最大值则触发拒绝策略。78、死锁的产生条件和解决办法?四大必要条件:互斥、请求保持、不可剥夺、循环等待。解决办法:破坏循环等待、设置锁超时、统一锁获取顺序、避免嵌套锁。79、CountDownLatch、CyclicBarrier、Semaphore的区别?CountDownLatch:计数器递减,一次性使用,等待所有任务完成。CyclicBarrier:循环屏障,可重复使用,线程互相等待至临界点再统一执行。Semaphore:信号量,控制并发线程数量,限流场景专用。80、ThreadLocal的原理和内存泄漏问题?ThreadLocal通过线程内部的ThreadLocalMap存储数据,线程隔离,互不干扰。内存泄漏原因:key弱引用回收,value强引用残留。解决办法:使用完手动调用remove()清除数据。五、JVM与内存机制(81-95题)81、JVM的内存区域划分?程序计数器、虚拟机栈、本地方法栈、堆、方法区(元空间)。其中堆和方法区是线程共享,其余为线程私有。82、各内存区域的作用?程序计数器:记录当前线程执行字节码行号,唯一无OOM区域。虚拟机栈:存储局部变量、方法栈帧,方法执行创建,结束销毁。堆:存储所有对象实例、数组,GC主要回收区域。方法区:存储类信息、常量、静态变量、编译后的代码。83、堆内存的分区?分为新生代、老年代。新生代又分Eden区、两个Survivor区(From/To),默认比例8:1:1。新生代存放新创建对象,老年代存放长期存活、大对象。84、对象的创建和分配流程?类加载校验→内存分配→初始化零值→设置对象头→初始化构造方法。优先在Eden区分配,大对象直接进入老年代,长期存活对象晋升老年代。85、GC的分类和回收时机?MinorGC:新生代垃圾回收,频率高、速度快,Eden区满触发。MajorGC/FullGC:老年代回收,速度慢、耗时久,老年代空间不足、元空间溢出触发。86、常见的垃圾回收算法?标记清除、标记复制、标记整理、分代收集。新生代用标记复制,老年代用标记清除+标记整理。87、CMS和G1垃圾收集器的特点?CMS:并发低停顿,主打老年代回收,响应速度快,内存碎片多。G1:分区收集,可预测停顿,兼顾吞吐量和响应速度,JDK9默认收集器,适合大内存服务器。88、如何判断对象是否可回收?采用可达性分析算法,以GCRoots为起点,无法遍历到的对象即为可回收对象。GCRoots包含栈变量、静态变量、常量、本地方法对象等。89、引用的四种类型?强引用:默认引用,永不回收;软引用:内存不足回收,适合缓存;弱引用:下次GC必回收;虚引用:仅做回收标记,无实际引用作用。90、类加载的全过程?加载→验证→准备→解析→初始化。加载读取class文件到内存,验证保证文件合法,准备初始化静态变量,解析替换符号引用,初始化执行静态代码块。91、双亲委派模型的原理和好处?类加载器优先委托父加载器加载,父加载器无法加载再由自身加载。好处:避免类重复加载、保证核心类安全、统一类加载规范。92、常见的类加载器?启动类加载器、扩展类加载器、应用程序类加载器、自定义类加载器,层层委托,形成双亲委派层级。93、OOM常见原因和排查思路?原因:内存泄漏、大对象过多、线程数过多、元空间不足、堆参数配置不合理。排查:查看异常日志、导出堆快照、分析内存占用、定位大对象和泄漏代码。94、栈溢出和堆溢出的区别?栈溢出:递归过深、方法嵌套过多,报StackOverflowError。堆溢出:对象创建过多、内存无法回收,报OutOfMemoryError。95、JVM调优的常用参数?-Xms初始堆内存、-Xmx最大堆内存、-Xmn新生代内存、-XX:+UseG1GC指定G1收集器、-XX:+PrintGCDetails打印GC日志,核心是控制堆大小、选择合适收集器、减少FullGC。六、Spring核心基础(96-105题)96、Spring的核心思想?IoC控制反转、AOP面向切面编程。IoC将对象创建和管理交给容器,降低耦合;AOP实现业务解耦,统一处理日志、事务、权限等通用逻辑。97、IoC的原理和优势?反转对象控制权,由开发者手动new对象转为Spring容器创建、管理、注入对象。优势:解耦、便于统一管理、方便测试、易于拓展维护。98、DI依赖注入的方式?构造器注入、setter方法注入、字段注入。推荐构造器注入,保证对象初始化完成后属性完整,避免空指针,适配Spring规范。99、SpringBean的生命周期?实例化→属性填充→初始化前置处理→初始化方法→初始化后置处理→容器使用→销毁。完整流程包含Bean前后置处理器、自定义初始化和销毁方法。100、Bean的作用域?singleton单例(默认,容器全局唯一)、prototype多例(每次获取新建对象)、request、session、application(web场景专用)。101、AOP的实现原理和应用场景?基于动态代理实现,目标方法前后切入通用逻辑。场景:统一日志记录、事务控制、权限校验、性能监控、异常处理,实现业务与通用逻辑解耦。102、JDK动态代理和CGLIB代理的区别?JDK代理:基于接口实现,无需依赖第三方包,只能代理接口实现类。CGLIB代理:基于子类继承实现,可代理无接口类,底层字节码增强,Spring默认优先JDK代理,无接口则用CGLIB。103、Spring事务的传播属性?核心7种:REQUIRED(默认,有则加入无则
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026Q起重机特种作业-Q2起重机司机限门式(官方)-专业技术理论参考试题库历年考点答案详解
- 2026粮食储备体系建设及玉米产业升级与食品安全监管研究分析
- 2026AI制药市场发展分析及研发效率与生物医药投资研究报告
- 2026农村电商物流投资布局评估及资本运作策略分析
- 湖北省武汉市武昌区实验小学六年级数学下册第3单元综合测试卷及答案
- 北京市第一中学七年级英语单元测试卷及答案
- 2026自动驾驶高精地图数据采集成本控制与商业变现分析
- 苏教版高二物理第4章运动学基础测试卷及答案
- 手部康复指导功能锻炼
- 全等三角形证明题
- 2026年国家药品监督管理局药品和医疗器械审评检查华中分中心编外招聘35人笔试参考题库及答案解析
- 2026年社区卫生服务中心招聘考试真题及答案解析
- 2026散装水产品行业保鲜技术发展与终端零售模式研究报告
- 九年级语文(内蒙古专用)上学期期末真题汇编-古诗词赏析试题(含答案)
- 中国心肺复苏指南(2026年更新版)
- 屋面防水翻新工程质量评估报告
- 脑出血患者的呼吸道管理与吸痰技巧
- 胖东来商品陈列技巧
- T/CEC 137-2017 输电线路钢管塔力加工技术规程
- 金属矿山井下检修培训
- 鄂尔多斯市国有资产投资控股集团有限公司招聘笔试真题2024
评论
0/150
提交评论