JavaSE 高频面试题(真实企业版)_第1页
JavaSE 高频面试题(真实企业版)_第2页
JavaSE 高频面试题(真实企业版)_第3页
JavaSE 高频面试题(真实企业版)_第4页
JavaSE 高频面试题(真实企业版)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

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

文档简介

JavaSE高频面试题(真实企业版)说明:本套试题基于一线互联网、传统软件公司真实面试场景整理,覆盖JavaSE核心高频考点,题型包含基础概念、原理辨析、代码实操、场景分析,无冗余套话,适配初级、中级Java开发面试自测。一、Java基础语法与核心概念1.简述JDK、JRE、JVM的区别与联系?JVM是Java虚拟机,是Java程序运行的核心载体,负责解析字节码、执行程序、内存管理、垃圾回收,是Java跨平台的核心,本身不包含编译工具。JRE是Java运行环境,包含JVM和Java核心运行类库,仅用于运行Java程序,不具备代码编译、调试等开发功能。JDK是Java开发工具包,包含JRE、Java编译工具、调试工具、打包工具等开发必备组件,是开发Java程序的完整环境。三者层级关系:JDK>JRE>JVM,开发需要JDK,运行程序只需JRE。2.==和equals()的区别是什么?==是运算符,可用于基本数据类型和引用数据类型。基本类型比较的是数值本身,引用类型比较的是对象的内存地址。equals()是Object类的方法,默认实现和==一致,比较对象地址。String、Integer等包装类重写了该方法,重写后比较的是对象的内容值。日常开发中,字符串、包装类对象比较值是否一致,优先使用equals();基本类型比较直接用==。3.String、StringBuilder、StringBuffer的区别?String是不可变字符串,底层为final修饰的字符数组,每次拼接、修改字符串都会生成新对象,频繁操作会产生大量垃圾对象,效率最低。StringBuilder和StringBuffer是可变字符串,底层数组可动态扩容,修改不会生成新对象。其中StringBuilder线程不安全,效率高;StringBuffer加了synchronized锁,线程安全,效率低。使用场景:单线程频繁字符串拼接用StringBuilder,多线程环境用StringBuffer,固定不变的字符串用String。4.final、finally、finalize的区别?final是修饰符,可修饰类、方法、变量。修饰类则类不可被继承,修饰方法则方法不可重写,修饰变量则变量不可二次赋值(基本类型值不变,引用类型地址不变)。finally是异常处理代码块,和try-catch配合使用,无论程序正常执行还是抛出异常,最终都会执行(除JVM退出等极端情况),常用于释放资源。finalize是Object类的废弃方法,用于垃圾回收前对象的资源收尾,该方法执行时机不确定、无法保证执行,现在已被废弃,不推荐使用。5.基本数据类型有哪些?包装类和基本类型的区别?Java8大基本数据类型:byte、short、int、long、float、double、char、boolean。区别:基本类型是原始数据类型,存储在栈内存,默认有默认值,不具备对象特性,效率高;包装类是引用类型,继承Object,存储在堆内存,可为null,包含大量工具方法,支持泛型使用。同时存在自动装箱(基本类型转包装类)、自动拆箱(包装类转基本类型)机制。二、面向对象OOP1.面向对象的四大特性是什么?分别简述含义封装:将类的属性私有化,通过公共方法对外提供访问、修改入口,隐藏内部实现细节,保证数据安全性。继承:子类继承父类的属性和方法,实现代码复用,减少冗余,同时支持子类拓展自有功能。多态:同一行为,不同子类有不同的实现方式,核心依托继承、重写、向上转型实现,提升代码扩展性。抽象:抽取事物的核心共性特征,忽略次要细节,通过抽象类或接口实现,规范代码结构,定义行为标准。2.接口和抽象类的区别?1、定义不同:抽象类用abstract修饰,接口用interface修饰;2、成员不同:抽象类可包含普通变量、常量、普通方法、抽象方法、构造方法;接口只能有常量、默认方法、静态方法、抽象方法(JDK8+),无构造方法;3、继承规则:类只能单继承抽象类,但可以多实现接口;4、设计理念:抽象类是对事物的抽象,侧重模板复用;接口是对行为的抽象,侧重功能规范。3.重写和重载的区别?重载:发生在同一个类中,方法名相同,参数列表(个数、类型、顺序)不同,返回值、修饰符无要求,属于编译时多态。重写:发生在父子类中,方法名、参数列表、返回值必须一致,子类权限修饰符大于等于父类,不能抛出更宽泛的异常,属于运行时多态。4.构造方法能不能被重写?为什么?不能。构造方法名必须和类名一致,子类和父类类名不同,无法满足重写的方法名一致要求;同时构造方法是创建对象时初始化使用,仅属于当前类,不存在父子重写关系。构造方法可以重载。三、集合框架1.List、Set、Map的区别?List:有序可重复集合,可通过下标索引访问元素,常用实现类ArrayList、LinkedList、Vector。Set:无序不可重复集合,无下标,元素唯一,常用实现类HashSet、LinkedHashSet、TreeSet。Map:键值对集合,key唯一不可重复,value可重复,无序(HashMap),常用实现类HashMap、LinkedHashMap、TreeMap。2.ArrayList和LinkedList的区别?底层结构:ArrayList基于动态数组,LinkedList基于双向链表;访问效率:ArrayList支持随机访问,查询速度快;LinkedList无下标,查询需遍历,速度慢;增删效率:ArrayList增删需移动数组元素,效率低;LinkedList仅修改节点指针,效率高;内存占用:ArrayList存在数组扩容冗余空间;LinkedList每个节点存储指针,内存占用更大。业务场景:高频查询用ArrayList,高频增删用LinkedList。3.HashMap的底层原理?JDK1.7和JDK1.8的区别?HashMap底层基于哈希表实现,通过哈希算法计算key的哈希值,确定数组存储位置,解决哈希冲突后存储键值对。JDK1.7:数组+链表结构,哈希冲突全部用链表解决,链表过长会导致查询效率极低;采用头插法插入元素,多线程环境易出现循环链表。JDK1.8:数组+链表+红黑树结构,链表长度超过8且数组容量大于64时,链表转为红黑树,提升查询效率;改为尾插法,避免循环链表;优化了哈希扰动算法,减少哈希冲突。4.HashMap和ConcurrentHashMap的区别?HashMap线程不安全,多线程并发操作会出现数据覆盖、丢失等问题,适合单线程环境。ConcurrentHashMap是线程安全的哈希集合,JDK1.7采用分段锁机制,JDK1.8采用CAS+synchronized锁,锁粒度更小,并发效率高,适合多线程场景。四、多线程1.线程和进程的区别?进程是操作系统资源分配的最小单位,独立占用内存、CPU资源,进程之间相互隔离,切换开销大。线程是CPU调度的最小单位,隶属于进程,共享进程的资源,线程之间切换开销小、通信方便。一个进程至少包含一个线程。2.实现多线程的几种方式?1、继承Thread类,重写run()方法,无返回值,无法再次继承其他类;2、实现Runnable接口,重写run()方法,无返回值,避免单继承限制,常用;3、实现Callable接口,重写call()方法,有返回值、可抛出异常,需配合FutureTask使用;4、通过线程池创建线程,统一管理线程,减少线程创建销毁开销,企业开发主流方式。3.synchronized和Lock的区别?1、锁类型:synchronized是内置锁、隐式锁,自动加锁释放锁;Lock是手动锁、显式锁,需手动调用lock()加锁、unlock()释放锁;2、灵活性:Lock可实现超时锁、可中断锁、读写锁,灵活性更高;synchronized功能单一;3、性能:JDK1.6之后synchronized优化后性能大幅提升,与Lock差距不大;4、适用场景:简单同步场景用synchronized,复杂并发控制(读写分离、超时等待)用Lock。4.什么是线程死锁?如何避免死锁?死锁是多个线程互相持有对方需要的锁,同时等待对方释放锁,导致所有线程永久阻塞,无法执行。产生死锁的四个必要条件:互斥条件、请求与保持条件、不可剥夺条件、循环等待条件。避免方式:破坏任意一个必要条件即可,统一锁的获取顺序、设置锁超时时间、避免嵌套锁等。五、JVM与内存机制1.JVM内存区域分为哪几块?各自作用?程序计数器:线程私有,记录当前线程执行的字节码行号,是唯一无内存溢出的区域。虚拟机栈:线程私有,存储局部变量、方法栈帧、操作数栈,方法执行时创建,结束销毁。本地方法栈:线程私有,为Native本地方法服务,功能和虚拟机栈类似。堆内存:线程共享,所有对象、数组均在堆中分配,是垃圾回收的主要区域。方法区:线程共享,存储类信息、常量、静态变量、即时编译代码等。2.堆内存的垃圾回收机制?GC的分类?GC核心是识别堆中无效对象,回收空闲内存,避免内存泄漏。通过可达性分析算法判断对象是否存活,无引用链的对象判定为垃圾对象。GC分为MinorGC(新生代垃圾回收,频率高、速度快)、MajorGC(老年代回收,频率低、速度慢)、FullGC(整堆回收,耗时最长,尽量避免)。3.什么是内存泄漏?常见的内存泄漏场景?内存泄漏是程序中已无用的对象,仍然被引用,无法被GC回收,长期堆积导致内存占用过高、OOM。常见场景:静态集合长期持有对象、未关闭的流/连接、线程池线程未销毁、内部类持有外部类引用等。六、异常与IO1.受检异常和非受检异常的区别?受检异常(编译时异常):继承Exception,编译阶段必须捕获或抛出,否则程序无法编译,如IO异常、SQL异常。非受检异常(运行时异常):继承RuntimeException,编译不校验,运行时才会抛出,如空指针、数组越界、类型转换异常。BIO:同步阻塞IO,一个请求对应一个线程,线程等待IO完成,并发能力差,适合小并发场景。NIO:同步非阻塞IO,基于缓冲区、通道、选择器,一个线程可处理多个请求,无需阻塞等待,并发性能高。七、编程场景面试题1.简述equals和hashCode的重写规范?1、如果两个对象equals()返回true,那么它们的hashCode必须相等;2、如果两个对象hashCode相等,equals()不一定为true;3、重写equals()必须重写hashCode(),否则会导致HashMap、H

温馨提示

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

评论

0/150

提交评论