Java 基础高频面试题及详细答案(实战版)_第1页
Java 基础高频面试题及详细答案(实战版)_第2页
Java 基础高频面试题及详细答案(实战版)_第3页
Java 基础高频面试题及详细答案(实战版)_第4页
Java 基础高频面试题及详细答案(实战版)_第5页
已阅读5页,还剩1页未读, 继续免费阅读

下载本文档

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

文档简介

Java基础高频面试题及详细答案(实战版)一、Java基础核心概念1.简述Java语言的特点Java是一门面向对象、跨平台、编译与解释结合的高级编程语言,核心特点主要有以下几点:跨平台性:依托JVM虚拟机,一次编译、到处运行,编译后的class文件可以在Windows、Linux、Mac等不同系统上运行。面向对象:封装、继承、多态三大特性齐全,符合主流开发思想,适合大型项目架构搭建。安全性高:拥有字节码校验、类加载机制、内存安全管理,避免指针越界等底层安全问题。自动垃圾回收:JVM自动回收无用对象占用的内存,减少手动内存操作,降低内存泄漏风险。多线程支持:原生内置多线程API,支持并发编程,适合开发高并发服务端程序。开源且生态成熟:拥有海量开源框架、中间件和社区资源,企业应用场景极其广泛。2.JDK、JRE、JVM的区别与联系三者是层层包含的关系:JDK包含JRE,JRE包含JVM。JVM(Java虚拟机):是Java跨平台的核心,负责运行编译后的class字节码文件,解析指令、管理内存、执行垃圾回收。本身不包含开发和运行工具,只负责程序运行。JRE(Java运行环境):包含JVM和Java核心类库,是Java程序运行的必备环境。普通用户运行Java程序只需安装JRE,无法进行代码开发和编译。JDK(Java开发工具包):包含JRE、编译工具(javac)、打包工具、调试工具等开发必备组件,是开发Java项目的基础,程序员开发项目必须安装JDK。3.Java基本数据类型有哪些?和引用类型的区别Java共有8种基本数据类型,分为四类:整型:byte、short、int、long浮点型:float、double字符型:char布尔型:boolean基本类型与引用类型核心区别:存储方式:基本类型直接在栈内存存储真实数值;引用类型在栈内存存对象地址,真实数据存在堆内存。默认值:基本类型有固定默认值(int默认0、boolean默认false);引用类型默认值为null。传递方式:基本类型是值传递,传递的是数据副本,修改副本不影响原数据;引用类型传递的是地址,修改会影响原对象。创建方式:基本类型直接赋值即可;引用类型需要new创建对象(字符串除外,有常量池优化)。4.==和equals()的区别这是面试高频考点,核心差异在比较规则不同:==:可以用于基本类型和引用类型。基本类型比较数值是否相等;引用类型比较对象内存地址是否相同,也就是判断是不是同一个对象。equals():是Object类的方法,仅适用于引用类型。默认实现和==一致,比较内存地址;但String、Integer等包装类重写了该方法,只比较对象内容是否一致,不比较地址。实战总结:比较字符串、包装类内容是否相等,一律用equals;判断对象是否为null先做空判断,避免空指针。5.String、StringBuilder、StringBuffer的区别String:字符串常量,底层是不可变字符数组。每次拼接、修改字符串都会生成新对象,效率低,适合少量、固定字符串使用。线程安全。StringBuffer:字符串可变缓冲区,所有方法都加了synchronized锁,线程安全,多线程环境下字符串拼接首选,但并发加锁会导致效率偏低。StringBuilder:字符串可变缓冲区,无锁、线程不安全,没有同步开销,执行效率最高,单线程字符串拼接优先使用。核心场景:单线程用StringBuilder,多线程用StringBuffer,固定不变的字符串用String。二、面向对象三大特性1.面向对象三大特性详解(1)封装将类的属性私有化,通过public方法对外提供访问和修改入口,隐藏内部实现细节。目的是保护数据安全,统一访问规则,降低代码出错概率。比如将成员变量用private修饰,通过get/set方法操作属性。(2)继承子类继承父类的非私有属性和方法,实现代码复用,减少重复代码。Java是单继承机制,一个子类只能有一个直接父类,一个父类可以被多个子类继承。继承的核心作用是代码复用、便于功能扩展。(3)多态同一个行为,不同子类实现不同的效果。实现前提:继承、方法重写、父类引用指向子类对象。多态可以让代码扩展性更强,新增子类无需修改原有核心代码,符合开闭原则。2.重写和重载的区别重载(Overload)同一个类中,方法名相同,参数列表不同(参数个数、类型、顺序不同),和返回值、访问修饰符无关。属于编译期多态,程序编译时就确定调用哪个方法。重写(Override)子类对父类的非私有、非final、非静态方法进行重新实现。要求方法名、参数列表、返回值完全一致,访问权限不能比父类更严格。属于运行期多态,程序运行时才确定执行逻辑。3.final、finally、finalize的区别final:是修饰符。修饰变量表示常量,只能赋值一次;修饰方法表示方法不能被重写;修饰类表示类不能被继承。finally:是异常处理关键字,搭配try-catch使用。无论代码是否抛出异常,finally中的代码都会执行,常用于释放资源(关闭流、关闭连接)。finalize:是Object类的废弃方法。JVM垃圾回收前会调用该方法清理对象资源,执行时机不确定,项目开发中基本不使用。三、异常体系1.Java异常体系分类Java所有异常的父类是Throwable,分为Error和Exception两大类:Error(错误):系统级严重错误,无法捕获和处理,比如内存溢出、栈溢出,程序直接崩溃。Exception(异常):程序可处理的异常,分为编译时异常(受检异常)和运行时异常(非受检异常)。编译时异常:必须手动try-catch捕获或throws抛出,否则编译报错,比如IO异常、文件不存在异常。运行时异常:程序运行时才会抛出,无需手动处理,比如空指针、数组越界、类型转换异常,大多是代码逻辑问题导致。2.try-catch-finally执行顺序1.先执行try中的代码;2.如果try代码抛出异常,匹配对应的catch块执行异常处理逻辑;无异常则跳过catch;3.无论是否出现异常、是否return,finally代码都会执行;唯一特例:如果执行System.exit(0)退出JVM,finally不会执行。四、集合框架高频题1.ArrayList和LinkedList的区别底层结构:ArrayList基于动态数组;LinkedList基于双向链表。查询效率:ArrayList支持随机访问,通过下标查询速度极快;LinkedList只能遍历查询,效率低。增删效率:ArrayList增删元素需要移动数组元素,尾部增删效率高,中间增删效率低;LinkedList只需修改节点指针,任意位置增删效率更高。内存占用:ArrayList会预留数组容量,存在内存冗余;LinkedList每个节点存储数据和指针,单个元素占用内存更大。实战选择:查询多、增删少用ArrayList,频繁增删用LinkedList。2.HashMap的底层原理(JDK1.8)HashMap底层是数组+链表+红黑树的结构,核心是哈希表存储数据:1.存储流程:通过key的hashCode计算哈希值,确定数组下标位置;2.如果该位置无元素,直接存入数据;3.如果发生哈希冲突(位置已有元素),遍历链表,key相同则覆盖值,key不同则追加链表节点;4.当链表长度大于8且数组容量大于64时,链表转为红黑树,提升查询效率;5.当数组元素数量超过负载因子(默认0.75)对应的阈值,数组自动扩容。补充:HashMap线程不安全,多线程环境推荐使用ConcurrentHashMap。3.HashSet的底层原理HashSet底层直接依托HashMap实现,存储元素时,将存入的值作为HashMap的key,value统一为固定的空对象。因此HashSet具备去重特性,原理和HashMap一致,依靠hashCode()和equals()方法判断元素是否重复。五、线程与基础语法1.线程和进程的区别进程:操作系统资源分配的最小单位,独立占用内存、CPU资源,进程之间相互独立,切换开销大。线程:进程内的执行单元,是CPU调度的最小单位,共享进程的内存资源,线程之间切换开销小、效率高。一个进程至少包含一个线程,多线程可以充分利用CPU资源,提升程序并发处理能力。2.Java实现多线程的三种方式继承Thread类:自定义类继承Thread,重写run()方法,调用start()启动线程。缺点是单继承限制,无法再继承其他类。实现Runnable接口:实现run()方法,传入Thread对象启动线程,无继承限制,适合资源共享场景,是最常用的方式。实现Callable接口:重写call()方法,支持返回值、抛出异常,搭配FutureTask使用,适合需要获取线程执行结果的场景。3.sleep()和wait()的区别所属类不同:sleep()是Thread类静态方法;wait()是Object类方法。锁机制不同:sleep()休眠时不释放锁;wait()等待时主动释放锁,其他线程可以抢占锁。唤醒方式不同:sleep()时间到自动唤醒;wait()需要手动调用notify()/notifyAll()唤醒。使用场景不同:sleep用于单纯延时;wait用于线程间通信、资源等待场景。六、内存与基础高频题1.Java栈内存和堆内存的区别栈内存:存储局部变量、方法引用,线程私有,空间小、访问速度快,方法执行结束后变量自动释放,内存由系统自动管理。堆内存:

温馨提示

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

最新文档

评论

0/150

提交评论