Java应届生面试核心题库及详细答案(校招专属)_第1页
Java应届生面试核心题库及详细答案(校招专属)_第2页
Java应届生面试核心题库及详细答案(校招专属)_第3页
Java应届生面试核心题库及详细答案(校招专属)_第4页
Java应届生面试核心题库及详细答案(校招专属)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

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

文档简介

Java应届生面试核心题库及详细答案(校招专属)本套题库专为Java应届毕业生整理,聚焦校招高频考点,摒弃复杂晦涩的工业级深钻内容,贴合应届生知识储备,答案口语化、接地气,适配笔试、初面、复面场景,覆盖Java基础、面向对象、集合、多线程、JVM、数据库、Spring核心等核心模块。一、Java基础核心(必考)1、说说JDK、JRE、JVM的区别与联系?三者是层层包含的关系,范围从大到小依次是JDK>JRE>JVM。JVM是Java虚拟机,是Java程序运行的核心载体,只负责解析、运行字节码文件,是Java跨平台的根本,没有编译代码的能力。JRE是Java运行环境,包含JVM和Java核心运行类库。如果只是运行别人写好的Java程序,只需要安装JRE即可。JDK是Java开发工具包,包含JRE、Java编译工具、调试工具等开发必备工具。做Java开发必须安装JDK,用来编写、编译、调试代码。2、==和equals()的区别?核心区别:比较的内容不一样。==是运算符,可以用于基本数据类型和引用数据类型。基本类型比较的是数值是否相等;引用类型比较的是对象的内存地址是否相同,也就是判断是不是同一个对象。equals()是Object类的方法,默认只能用于引用类型。原生的equals方法底层就是==,比较内存地址。但像String、Integer这些常用类,都重写了equals方法,重写后只比较对象的内容值,不比较地址。举个例子:newString("abc")=="abc"结果是false,地址不同;但两个字符串equals对比结果是true,内容一致。3、String、StringBuilder、StringBuffer的区别?1、可变性:String是不可变字符串,每次拼接、修改都会生成新的字符串对象;StringBuilder和StringBuffer是可变字符串,修改时不会创建新对象。2、线程安全:StringBuffer的方法加了synchronized锁,线程安全,适合多线程场景;StringBuilder没有锁,线程不安全,效率更高,是单线程首选。3、使用场景:日常字符串少量操作直接用String;频繁拼接字符串优先用StringBuilder;多线程下字符串操作用StringBuffer。4、final、finally、finalize的区别?三个单词看似相似,作用完全不同。final是修饰符,可以修饰类、方法、变量。修饰类表示类不能被继承;修饰方法表示方法不能被重写;修饰变量表示变量是常量,只能赋值一次。finally是异常处理的关键字,搭配try-catch使用,它里面的代码几乎一定会执行,常用于释放资源,比如关闭流、关闭数据库连接。唯一不执行的场景是代码中执行了System.exit(0)退出程序。finalize()是Object类的废弃方法,JDK9之后已被废弃。原本作用是垃圾回收器回收对象前,自动调用该方法,用来做资源收尾,但执行时机不确定、无法保证调用,现在基本不用。5、基本数据类型有哪些?各自占用字节?Java有8种基本数据类型,分为四类:整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)浮点型:float(4字节)、double(8字节)字符型:char(2字节)布尔型:boolean(1字节,JVM规范定义)注意:long类型赋值需要加L后缀,float需要加F后缀,避免类型转换报错。二、面向对象OOP(校招重点)1、面向对象的四大特性?分别怎么理解?四大特性:封装、继承、多态、抽象。封装:将类的属性私有化,通过public的get/set方法对外提供访问,隐藏内部实现细节,保证数据安全,降低代码耦合度。继承:子类继承父类的属性和方法,实现代码复用,减少重复代码,同时子类可以拓展自己的独有功能。Java是单继承,一个类只能继承一个父类,可以实现多个接口。多态:同一个行为,不同对象有不同的表现形式。核心是父类引用指向子类对象,分为编译多态(方法重载)和运行多态(方法重写)。抽象:通过abstract定义抽象类和抽象方法,抽象方法只有声明没有实现,由子类实现。作用是规范子类的行为,定义统一的标准。2、重载和重写的区别?1、定义不同:重载是在同一个类中,多个方法名相同,参数列表不同(参数个数、类型、顺序);重写是子类对父类的非私有、非final、非静态方法进行重新实现。2、权限不同:重载对权限修饰符无要求;重写的方法权限必须大于等于父类方法权限。3、返回值:重载返回值可以随意修改;重写返回值必须和父类一致或是其子类。4、发生时机:重载是编译期多态,编译时就确定调用哪个方法;重写是运行期多态,运行时才确定具体实现。3、接口和抽象类的区别?1、继承方式:抽象类是单继承,一个类只能继承一个抽象类;接口是多实现,一个类可以实现多个接口。2、成员变量:抽象类可以有普通成员变量、常量;接口中默认都是常量,不能定义普通变量。3、方法定义:抽象类可以有普通方法、构造方法、抽象方法;JDK8之前接口只有抽象方法,JDK8新增默认方法、静态方法,JDK9新增私有方法。接口没有构造方法。4、设计思想:抽象类是模板设计,描述一类事物的共性;接口是行为规范,描述对象能做什么,不关心是什么。三、Java集合框架(高频面试)1、ArrayList和LinkedList的区别?1、底层结构:ArrayList底层是动态数组;LinkedList底层是双向链表。2、查询效率:ArrayList支持随机访问,通过下标查询速度极快;LinkedList没有下标,查询需要遍历链表,速度慢。3、增删效率:ArrayList增删元素时,需要移动数组元素,扩容还需要复制数组,效率低;LinkedList只需要修改节点指针,无需移动元素,增删效率更高。4、内存占用:ArrayList会预留冗余容量,存在内存浪费;LinkedList每个节点都要存储前后节点地址,内存开销更大。日常开发中,查询多、增删少优先用ArrayList,绝大多数场景都是ArrayList。2、HashMap的底层原理?JDK1.8做了哪些优化?HashMap底层是数组+链表+红黑树的结构,基于哈希表实现,用来存储键值对数据。存储流程:通过key的hash值计算数组下标,如果下标位置为空,直接存入;如果有元素,发生哈希冲突,采用链表法解决;链表长度超过8且数组容量大于等于64时,链表转为红黑树,提升查询效率。JDK1.8优化点:1、底层由单纯的数组+链表,升级为数组+链表+红黑树,解决链表过长查询慢的问题;2、优化hash算法,减少哈希冲突;3、插入元素由头插法改为尾插法,彻底解决JDK1.7多线程下循环链表死循环的问题;4、树化阈值为8,降级阈值为6,平衡性能和内存。3、HashMap和HashTable的区别?1、线程安全:HashTable线程安全,所有方法加了锁;HashMap线程不安全,效率更高,是日常开发首选。2、null值支持:HashMap允许key和value为null(key只能一个null);HashTable不允许key和value为null,会直接报错。3、初始容量:HashMap默认初始容量16,扩容2倍;HashTable默认容量11,扩容2倍加1。4、继承结构:HashTable继承Dictionary类,HashMap继承AbstractMap类。补充:多线程场景下,推荐使用ConcurrentHashMap,不推荐HashTable,并发性能更好。四、多线程与并发(校招难点)1、创建线程的几种方式?常用四种方式,应届生掌握前三种即可:1、继承Thread类:重写run方法,调用start()启动线程,缺点是单继承,无法再继承其他类。2、实现Runnable接口:重写run方法,无返回值、无异常抛出,避免单继承限制,适合资源共享场景。3、实现Callable接口:重写call方法,有返回值、可以抛出异常,需要配合FutureTask使用。4、线程池创建:通过Executors或ThreadPoolExecutor创建,实际开发中优先使用线程池,避免频繁创建销毁线程消耗资源。2、start()和run()方法的区别?run()是线程的业务方法,只是一个普通的成员方法,直接调用只会在当前主线程中执行,不会开启新线程。start()是开启线程的核心方法,会告诉JVM启动新线程,进入就绪状态,等待CPU调度,调度成功后自动执行run()方法,真正实现多线程并发执行。3、synchronized和Lock的区别?1、锁类型:synchronized是JVM底层原生锁,隐式锁,自动加锁、自动释放锁;Lock是代码层面的显式锁,需要手动lock()加锁、unlock()释放锁。2、灵活性:Lock灵活性更高,可以设置超时锁、可中断锁,支持读写分离锁;synchronized不具备这些特性。3、性能:JDK1.6之后synchronized做了大量优化(偏向锁、轻量级锁、重量级锁),性能和Lock基本持平,低并发下synchronized更简洁。4、适用场景:简单并发场景用synchronized;高并发、需要精细控制锁的场景用Lock。五、JVM基础(应届生必会浅度考点)1、JVM内存区域分为哪几块?各自作用?JVM运行时数据区分为5个区域:程序计数器、虚拟机栈、本地方法栈、堆、方法区。1、程序计数器:线程私有,记录当前线程执行的字节码行号,是唯一一个没有内存溢出的区域。2、虚拟机栈:线程私有,存储方法栈帧、局部变量、方法返回地址,方法调用和执行都依赖栈,栈深度过大会出现栈溢出。3、本地方法栈:线程私有,作用和虚拟机栈类似,专门为JDK的native本地方法服务。4、堆:线程共享,是JVM最大的内存区域,所有对象和数组都在堆中分配内存,也是垃圾回收的主要区域。5、方法区:线程共享,存储类信息、常量、静态变量、即时编译代码等,JDK1.8后改为元空间,使用本地内存。2、GC垃圾回收的作用?哪些对象会被回收?GC的核心作用是自动回收堆内存中无用的对象,释放内存空间,避免内存泄漏、内存溢出,无需手动操作。没有有效引用指向的对象,会被判定为垃圾对象,等待GC回收。比如:对象赋值为null、超出作用域的对象、集合中移除的对象等。六、MySQL数据库(基础+面试高频)1、MySQL的索引类型及区别?1、主键索引:唯一且非空,一张表只能有一个主键索引,查询优先级最高。2、唯一索引:字段值唯一,可以为空,一张表可以有多个唯一索引。3、普通索引:最基础的索引,无唯一性限制,单纯提升查询速度。4、联合索引:多个字段组成的索引,遵循最左前缀原则,查询时必须匹配左侧字段才能生效。5、全文索引:用于长文本模糊查询,替代like模糊查询,效率更高。2、索引失效的常见场景?1、联合索引不满足最左前缀原则;2、索引字段使用了函数、运算、类型转换;3、like查询以%开头;4、or连接的条件中有非索引字段;5、MySQL判断全表扫描比索引查询更快时,会自动放弃索引。3、事务的四大特性ACID?原子性:事务是最小执行单元,要么全部执行成功,要么全部回滚,不会出现部分执行的情况。一致性:事务执行前后,数据库的数据完整性、约束规则保持一致,不会出现数据错乱。隔离性:多个事务并发执行时,相互独立、互不干扰,通过事务隔离级别控制并发问题。持久性:事务提交成功后,数据会永久写入数据库,即使宕机也不会丢失。七、Spring框架核心(校招核心)1、Spring的两大核心思想?两大核心:IOC(控制反转)、AOP(面向切面编程)。IOC控制反转:将对象的创建、管理、依赖注入的权限,从代码中交给Spring容器统一管理,实现代码解耦,不用手动new对象。核心是依赖注入DI。AOP面向切面编程:在不修改原有业务代码的前提下,对方法进行增强,实现日志记录、事务控制、权限校验、性能监控等通用功能,符合开闭原则。2、SpringBean的生命周期?1、实例化:Spring容器根据配置,通过反射创建Bean对象;2、属性填充:完成依赖注入,给Bean的属性赋值;3、初始化:执行前置处理方法、自定义初始化方法、后置处理方法;4、销毁:容器关闭时,执行Bean的销毁方法;5、回收:Bean对象被垃圾回收。3、SpringMVC的执行流程?1、客户端发起请求,前端控制器DispatcherServlet接收所有请求;2、DispatcherServlet调用处理器映射器,找到对应的Controller;3、处理器适配器执行Controller中的业务方法;4、Controller处理业务,返回ModelAndView;5、视图解析器解析视图,渲染页面;6、将最终响应结果返回给客户端。八、常见手写面试题(应届生加分项)1、手写单例模式(饿汉式+懒汉式)饿汉式(线程安全,简单常用):类加载时直接创建对象,无线程安全问题,缺点是浪费内存。PlainText

publicclassSingleton{

//私有静态常量对象

privatestaticfinalSin

温馨提示

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

评论

0/150

提交评论