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

下载本文档

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

文档简介

Java电话面试高频题库及详细答案(实战口语版)本次题库适配Java后端电话初面,题型均为一线企业高频提问,答案贴合真实面试口述逻辑,简洁精准、不堆砌理论,完全贴合职场面试话术,适合电话沟通、快速问答场景。一、Java基础核心(高频必问)1、说说==和equals的区别?首先,==是比较运算符,对于基本数据类型,比较的是变量的实际数值;对于引用类型,比较的是对象的内存地址。而equals是Object类的方法,默认情况下和==效果一样,也是比较对象地址。但像String、Integer这些常用类,都重写了equals方法,重写后不再比较地址,而是比较对象的实际内容值。日常开发中,比较字符串、对象内容是否一致,一律用equals;基本类型数值比较用==。2、String、StringBuilder、StringBuffer的区别?第一,线程安全:StringBuffer是线程安全的,它的方法都加了synchronized锁;StringBuilder线程不安全,没有锁。第二,性能:StringBuilder性能最高,StringBuffer次之,String性能最低。因为String是不可变字符串,每次拼接都会生成新对象,频繁拼接会产生大量无用对象,占用内存。第三,使用场景:少量字符串拼接直接用String;单线程大量拼接用StringBuilder;多线程环境下字符串拼接用StringBuffer。3、final、finally、finalize的区别?final是修饰符,可以修饰类、方法、变量。修饰类表示类不能被继承;修饰方法表示方法不能重写;修饰变量表示变量是常量,赋值后不能修改。finally是异常处理的关键字,搭配try-catch使用,它里面的代码几乎都会执行,主要用来释放资源,比如关闭流、关闭连接,只有执行System.exit(0)时不会执行。finalize是Object类的方法,JVM垃圾回收前会调用这个方法,用来做对象的收尾清理工作。现在版本已经不推荐使用,因为执行时机不确定,容易导致内存泄漏。4、接口和抽象类的区别?第一,定义不同:抽象类用abstract修饰,可以包含普通成员变量、构造方法、抽象方法和普通方法;接口是interface,JDK8之前只能有常量和抽象方法,JDK8后可以有默认方法和静态方法,JDK9后可以有私有方法。第二,继承规则:类只能单继承抽象类,但可以多实现接口,解决了单继承的局限。第三,构造方法:抽象类有构造方法,用于子类初始化;接口没有构造方法。第四,使用场景:抽象类用于抽取子类的通用属性和行为;接口用于定义统一的行为规范,做功能扩展和解耦。二、Java集合框架(面试重点)1、ArrayList和LinkedList的区别?底层结构不一样,ArrayList基于动态数组实现,LinkedList基于双向链表实现。查询方面:ArrayList支持随机访问,通过下标查询速度非常快;LinkedList没有下标,查询需要遍历链表,速度很慢。增删方面:ArrayList增删元素时需要移动数组元素,量大的时候效率低;LinkedList只需要修改节点指针,首尾增删效率很高。日常开发中,查询多、增删少优先用ArrayList;频繁首尾增删的场景用LinkedList。2、HashMap的底层原理?JDK1.7和1.8的区别?HashMap底层是数组+链表,JDK1.8之后改成了数组+链表+红黑树。它是基于哈希表实现的,通过hash算法计算key的哈希值,确定数组存储下标。如果出现哈希冲突,就用链表挂载冲突元素。JDK1.7和1.8核心区别:1、数据结构:1.7是纯数组+链表;1.8加入红黑树,链表长度超过8、数组容量大于64时,链表会转为红黑树,提升查询效率。2、哈希算法:1.8优化了hash计算方式,减少哈希冲突概率。3、扩容机制:1.7是头插法,多线程环境容易出现环形链表死循环;1.8改成尾插法,规避了这个问题。4、树化与退化:链表长度小于6时,红黑树会退化为链表,平衡性能和内存占用。3、HashMap为什么线程不安全?怎么解决?HashMap线程不安全主要体现在多线程扩容、多线程put数据场景。JDK1.7会出现环形链表、数据丢失;JDK1.8虽然解决了环形链表,但依然会存在数据覆盖、数据丢失的问题。解决方式有三种:一是使用HashTable,方法加锁,但是效率极低;二是使用Collections.synchronizedMap包装,整体加锁,性能一般;三是工作中最常用的ConcurrentHashMap,分段锁机制,并发性能最好。4、ConcurrentHashMap的原理?JDK1.7采用分段锁机制,将容器分成多个Segment分段,每个分段独立加锁,多线程操作不同分段互不影响,提升并发效率。JDK1.8摒弃了分段锁,采用CAS+synchronized锁,锁的粒度细化到数组的单个节点。同时沿用数组+链表+红黑树结构,并发性能进一步提升,put、get操作的效率都更高,是目前并发场景的首选集合。三、多线程与并发(核心难点)1、线程和进程的区别?进程是操作系统资源分配的最小单位,每个进程独立占用内存资源,进程之间互不干扰,切换开销大。线程是进程内的执行单元,是CPU调度的最小单位,一个进程包含多个线程,线程共享进程的内存资源,线程切换开销很小。简单说,进程是独立的程序,线程是程序里的执行任务,多线程就是一个程序同时干多件事。2、synchronized和Lock的区别?1、锁类型:synchronized是内置锁,JVM层面实现,自动加锁自动释放;Lock是代码层面的显式锁,需要手动lock、手动unlock。2、灵活性:Lock更灵活,可以尝试获取锁、超时获取锁、可中断锁,能解决死锁问题;synchronized阻塞后无法中断,只能等待释放。3、锁粒度:synchronized可以修饰方法、代码块;Lock锁粒度更精细。4、性能:低并发下两者性能差不多,高并发下Lock性能更优。日常简单同步用synchronized,复杂并发场景用ReentrantLock。3、volatile关键字的作用?volatile主要有两个作用:一是保证变量的可见性,一个线程修改变量后,其他线程能立刻感知到最新值;二是禁止指令重排序。需要重点注意,volatile不能保证原子性,像i++这种复合操作,volatile修饰依然会出现线程安全问题,只能保证单读单写的安全。4、什么是死锁?产生死锁的四个条件?如何避免?死锁就是多个线程互相持有对方需要的锁,同时等待对方释放锁,导致所有线程永久阻塞,程序卡死。四个必要条件:互斥条件、请求与保持条件、不可剥夺条件、循环等待条件。四个条件同时满足才会产生死锁。避免方式:破坏任意一个条件即可,最常用的是统一锁的获取顺序、设置锁超时、使用可中断锁、减少锁嵌套。四、JVM与内存调优(必问基础)1、JVM内存区域分为哪几块?各自作用?一共分为五大区域:1、程序计数器:线程私有,记录当前线程执行的字节码行号,是唯一一个没有内存溢出的区域。2、虚拟机栈:线程私有,存储方法栈帧、局部变量、方法返回地址,方法调用和执行都在这里,栈满会报StackOverflowError。3、本地方法栈:线程私有,作用和虚拟机栈类似,专门服务于native本地方法。4、堆内存:线程共享,是JVM最大的内存区域,所有对象和数组都在这里分配内存,也是垃圾回收的主要区域,容易发生OOM。5、方法区:线程共享,存储类信息、常量、静态变量、编译后的代码,JDK1.8后方法区改为元空间,使用本地内存。2、GC垃圾回收机制?哪些对象会被回收?GC就是JVM自动回收堆内存中无效对象,释放内存空间,无需手动操作。没有任何引用指向的对象会被判定为垃圾对象,会被GC回收。常用的判定方式是可达性分析,从GCRoots出发,遍历不到的对象就是垃圾对象。GCRoots包含:虚拟机栈中引用的对象、静态变量引用对象、常量引用对象、本地方法栈引用对象。3、年轻代、老年代的垃圾回收特点?年轻代存放新建对象,对象存活时间短,垃圾多、回收频繁,使用复制算法,回收速度快,发生的GC叫MinorGC。老年代存放存活时间久的对象、大对象,对象存活率高、回收频率低,使用标记整理、标记清除算法,回收速度慢,发生的GC叫MajorGC,耗时较长,频繁MajorGC会导致程序卡顿。五、Spring核心知识点1、Spring的核心思想是什么?核心是IOC控制反转和AOP面向切面编程。IOC就是把对象的创建、管理、依赖注入交给Spring容器,不再由开发者手动new对象,实现代码解耦,方便统一管理对象。AOP是在不修改原有代码的前提下,对方法进行增强,比如统一日志、事务控制、权限校验、性能监控,核心是动态代理。2、IOC的初始化流程?1、启动项目,Spring加载配置类或配置文件,扫描所有带注解的Bean;2、解析扫描到的类,生成Bean定义信息,存入Bean定义注册表;3、根据Bean定义,通过反射创建Bean实例;4、完成Bean的属性填充、依赖注入;5、执行Bean的初始化方法;6、将完整的Bean放入单例池,供全局使用。3、SpringBean的生命周期?实例化>属性填充>前置处理>初始化方法执行>后置处理>存入容器>容器关闭销毁。简单说:先创建对象,再赋值,再初始化,最后交由容器管理,项目关闭时执行销毁方法。4、SpringAOP的实现原理?JDK动态代理和CGLIB代理区别?AOP底层依靠动态代理实现。如果目标类有接口,默认使用JDK动态代理,基于接口生成代理类;如果目标类没有接口,使用CGLIB代理,基于子类继承实现代理。区别:JDK代理只能代理接口方法,速度快;CGLIB可以代理普通类,通过字节码增强实现,适用范围更广,Spring默认优先JDK代理。六、MySQL数据库(高频面试)1、InnoDB和MyISAM的区别?1、事务支持:InnoDB支持事务、事务隔离级别;MyISAM不支持事务。2、锁机制:InnoDB支持行锁和表锁;MyISAM只有表锁,并发能力差。3、崩溃恢复:InnoDB有日志机制,宕机可以数据恢复;MyISAM宕机容易数据损坏。4、外键:InnoDB支持外键,MyISAM不支持。工作中全部使用InnoDB,MyISAM基本被淘汰。2、索引失效的场景有哪些?1、like以%开头,比如%xxx;2、索引列使用函数、运算、类型转换;3、or前后字段没有同时建立索引;4、违背最左匹配原则,联合索引跳过前置列;5、字段隐式类型转换,比如字符串字段用数值查询;6、mysql判断全表扫描比索引更快时,会主动放弃索引。3、事务的四大特性和四大隔离级别?四大特性ACID:原子性、一致性、隔离性、持久性。四大隔离级别(从低到高):1、读未提交:能读到未提交数据,会出现脏读、不可重复读、幻读;2、读已提交:只能读提交数据,解决脏读,存在不可重复读、幻读;3、可重复读:MySQL默认级别,解决脏读、不可重复读,存在幻读;4、串行化:最高级别,完全解决所有问题,但是性能最差。七、常见场景面试题(电话面试压轴)1、项目中遇到过线程安全问题吗?怎么解决的?遇到过,比如多线程统计数据、多线程修改共享变量时,出现过数据覆盖、统计结果不准确的问题。解决方式:简单场景用synchronized加锁;高并发场景用ReentrantLock显式锁;计数场景用Atomic原子类;集合并发问题直接使用ConcurrentHashMap、CopyOnWriteArrayList等并发集合。2、项目中怎么优化SQL的?首先

温馨提示

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

评论

0/150

提交评论