Java基础知识
2023-10-28 09:32:13 1 举报
AI智能生成
Java基础知识,个人汇总上百篇面试经验之后绘制的思维导图,方便全局复习
作者其他创作
大纲/内容
基础
数据类型
Java 中有哪 8 种基本数据类型?它们的默认值和占用的空间大小知道不? 说说这 8 种基本数据类型对应的包装类型。
包装类型的常量池技术了解么?
-128-127,高位可配置,最小127
什么是自动拆装箱?原理?
基本类型和包装类型之间的互转。装箱其实就是调用了 包装类的valueOf()方法,拆箱其实就是调用了 xxxValue()方法。
遇到过自动拆箱引发的 NPE 问题吗?
作为参数进行方法调用:目标方法是基础数据类型,传入的是包装类型,该包装对象为null
数据库的查询结果:结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险
查询数据库时不是count(*),而是查某个可能查不到的int字段,dao层的方法使用int作为返回值接收,就会出发拆装箱导致NPE
三目运算符使用不当:会导致诡异的 NPE 异常
String、StringBuffer 和 StringBuilder 的区别是什么?
Java基础常见面试题总结(中)
可变性(AbstractStringBuilder、append)
线程安全性(String不可变,Buffer锁,Builder无锁)
性能(String修改新建对象,Builder只多Buffer10-15%性能)
String 为什么是不可变的?
保存字符串的数组被 final 修饰且为私有的,并且String 类没有提供/暴露修改这个字符串的方法。
String 类被 final 修饰导致其不能被继承,进而避免了子类破坏 String 不可变。
字符串拼接用“+” 还是 StringBuilder?
+、+=运算符重载过,字符串对象通过“+”的字符串拼接方式。
实际上是通过 StringBuilder 调用 append() 方法实现的,拼接完成之后调用 toString() 得到一个 String 对象 。
在循环内使用“+”进行字符串的拼接的话,存在比较明显的缺陷:编译器不会创建单个 StringBuilder 以复用,会导致创建过多的 StringBuilder 对象。
面向对象
重载和重写的区别?
深拷贝和浅拷贝区别了解吗?什么是引用拷贝?
浅拷贝
堆上创建一个新的对象(区别于引用拷贝的一点),如果原对象内部的属性是引用类型,则直接复制内部对象的引用地址,即和原对象共用同一个内部对象。
深拷贝
深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。
实际遇到的问题
出入库业务场景几十辆车批量提交,产品不接受异步,需要串行改并行,开发过程中因为使用BeanUtils直接浅拷贝导致并行时修改了共享变量,出现线程不安全问题
== 和 equals() 的区别?
内部类了解吗?匿名内部类了解吗?
种类
成员内部类
OutClass.InnerClass inner = new OutClass().new InnerClass();
静态内部类
局部内部类
匿名内部类
接口和抽象类有什么共同点和区别?如何选择?
接口主要用于对类的能力进行约束,你实现了某个接口就具有了对应的能力。
(举例Spring:Aware\BeanFactoryAware\BeanClassLoaderAware)
抽象类主要用于代码复用,强调的是所属关系。
反射&注解&泛型
说说Java 反射吧?
什么是反射?
赋予了我们在运行时分析类以及执行类中方法的能力,通过反射可以获取任意一个类的所有属性和方法,还可以打破类定义的约束来调用这些方法和属性。
反射有什么优点/缺点?
优点
让我们的代码更加灵活、为各种框架提供开箱即用的功能提供了便利。
比如运行期的注解能力实现
缺点
在运行时有了分析操作类的能力的同时,也增加了安全问题,比如可以无视泛型参数的安全检查(泛型参数的安全检查发生在编译时)
反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。
你是怎么理解反射的(为什么框架需要反射)?
谈谈对 Java 注解的理解,解决了什么问题?
DRY法则,减少重复代码,降低代码复用的难度
编译器层面
提前告诉编译器部分编译规则
比如@Override,判断是否重写
对于可能返回空值得接口提供@Nullable,避免上游调用产生NPE
业务层面
通用接口调用情况的埋点监控
哪些接口没流量了,增加可监控时间范围
业务层面的重复提交拦截校验
@RejectDuplicateRequest
业务层面的一些通用性业务规则校验
是否具有虚拟车架号
框架层面
简化各种框架能力接入难度
@SpringBoot
@EventListener
Java 泛型了解么?
泛型的作用?
什么是类型擦除?
泛型有哪些限制?
介绍一下常用的通配符?
SPI
什么是 SPI?有什么用?
描述
Service Provider Interface
专门提供给服务提供者或者扩展框架功能的开发者去使用的一个接口。
作用
将服务接口和具体的服务实现分离开来,将服务调用方和服务实现者解耦
能够提升程序的扩展性、可维护性
修改或者替换服务实现并不需要修改调用方
缺点
需要遍历加载所有的实现类,不能做到按需加载,这样效率还是相对较低的。
当多个 ServiceLoader 同时 load 时,会有并发问题。
用途
Spring 框架(Spring.factories\SDK打包)、数据库加载驱动、日志接口、以及 Dubbo 的扩展实现等等。
SPI 和 API 有什么区别?
API定义在被调用方,由被调用方定义好接口及实现,提供给调用方进行调用
SPI定义在调用方,由调用方定义好,由拓展组件或者厂商自己提供对应实现,在调用时由调用方自行确定规则,选择具体的实现
Java SPI 实现原理了解吗?
I/O
BIO,NIO,AIO 有什么区别?
什么是IO?
计算机结构的角度
冯.诺依曼结构的输入输出设备
应用程序的角度
为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为 用户空间(User space) 和 内核空间(Kernel space )
用户进程想要执行 IO 操作的话,必须通过 系统调用 来间接访问内核空间
磁盘 IO(读写文件)
网络 IO(网络请求和响应)
通过系统调用使进程能够访问到应用进行IO操作
BIO (Blocking I/O)
NIO (Non-blocking)
I/O 多路复用模型
AIO (Asynchronous I/O)
Java IO 中的设计模式有哪些?
装饰器(Decorator)模式
对能力进行增强,通过组合代替继承避免类爆炸,降低功能组合的复杂度
对于字节流来说, FilterInputStream (对应输入流)和FilterOutputStream(对应输出流)是装饰器模式的核心
分别用于增强 InputStream 和OutputStream子类对象的功能。
常见的BufferedInputStream(字节缓冲输入流)、DataInputStream 等等都是FilterInputStream 的子类,BufferedOutputStream(字节缓冲输出流)、DataOutputStream等等都是FilterOutputStream的子类
好处
由于字节流的能力较多,比如增加缓存能力、增加读取压缩包的能力等,通过组合代替继承能够降低子类的数量和复杂度
详见设计模式XML
装饰器模式 更侧重于动态地增强原始类的功能
适配器(Adapter)模式
InputStreamReader 和 OutputStreamWriter 就是两个适配器(Adapter)
字节流和字符流之间的桥梁
InputStreamReader 使用 StreamDecoder (流解码器)对字节进行解码,实现字节流到字符流的转换
OutputStreamWriter 使用StreamEncoder(流编码器)对字符进行编码,实现字符流到字节流的转换
适配器模式 更侧重于让接口不兼容而不能交互的类可以一起工作
子主题
Files 类的 newInputStream 方法用于创建 InputStream 对象(静态工厂)
Paths 类的 get 方法创建 Path 对象(静态工厂)
ZipFileSystem 类(sun.nio包下的类,属于 java.nio 相关的一些内部实现)的 getPath 的方法创建 Path 对象(简单工厂)
观察者模式
NIO 中的文件目录监听服务基于 WatchService 接口和 Watchable 接口
WatchService 属于观察者,Watchable 属于被观察者
集合
基础
说说 List,Set,Map 三者的区别?
元素是否有序、是否可以重复、存储的元素类型(比如 Map 存储的就是键值对)
List,Set,Map 在 Java 中分别由哪些对应的实现类?底层的数据结构?
List
ArrayList: Object[]数组
Vector:Object[]数组
LinkedList: 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
Vector:Object[]数组
LinkedList: 双向链表(JDK1.6 之前为循环链表,JDK1.7 取消了循环)
Set
HashSet
TreeSet
TreeSet
Map
HashMap
ConcurrentHashMap
ConcurrentHashMap
有哪些集合是线程不安全的?怎么解决呢?
Arraylist(不安全) 和 Vector(安全)
Vector给涉及数据变更访问得接口都增加了synchronized关键字,进行对象实例层面得枷锁
性能低,可以用CopyOnWriteArrayList
HashMap(不安全) 和 ConcurrentHashMap(安全)
List
ArrayList 和 Vector 的区别?
上面有
ArrayList 与 LinkedList 区别?
底层数据结构
A:Object[]
L:双端链表
插入和删除是否受元素位置的影响
是否支持快速随机访问
内存空间占用
ArrayList 扩容机制
如果不指定大小,第一次数据写入扩容到10
int newCapacity = oldCapacity + (oldCapacity >> 1)
Queue
Queue 与 Deque 的区别
Queue 是单端队列,只能从一端插入元素,另一端删除元素,实现上一般遵循 先进先出(FIFO) 规则
Deque 是双端队列,在队列的两端均可以插入或删除元素
ArrayDeque 与 LinkedList 的区别
底层数据存储格式不同,一个是transient Object[] elements; 一个是链表Node
PriorityQueue 有什么特点
元素出队顺序是与优先级相关的,即总是优先级最高的元素先出队
HashMap
HashMap 查询,删除的时间复杂度
没有哈希冲突的情况
O(1)
转链表的情况(<6)
O(N)
这个地方的N是指发生冲突后,同一个bulkect中的所有元素,并不是所有的元素
链表转红黑树的情况(>8)
O(logN)
这个地方的N和上面一样
HashMap 的底层实现
HashMap 的长度为什么是 2 的幂次方
比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同
HashMap 和 Hashtable 的区别?HashMap 和 HashSet 区别?HashMap 和 TreeMap 区别?
ConcurrentHashMap
ConcurrentHashMap 和 Hashtable 的区别?
ConcurrentHashMap 线程安全的具体实现方式/底层具体实现
并发
基础
什么是线程和进程?线程与进程的关系,区别及优缺点
为什么要使用多线程呢?
说说线程的生命周期和状态?
什么是线程死锁?如何避免死锁?如何预防和避免线程死锁?
乐观锁和悲观锁
乐观锁和悲观锁的区别
如何实现乐观锁?
CAS 了解么?原理?
乐观锁存在哪些问题?
什么是 ABA 问题?ABA 问题怎么解决?
JMM
并发编程的三个重要特性
什么是 JMM?为什么需要 JMM?
JMM 是如何抽象线程和主内存之间的关系?
Java 内存区域和 JMM 有何区别?
happens-before 原则是什么?为什么需要 happens-before 原则?
synchronized 和 volatile
synchronized 关键字
volatile 关键字
ThreadLocal
线程池
AQS
AQS 是什么?AQS 的原理是什么
Semaphore 有什么用?Semaphore 的原理是什么?
CountDownLatch 有什么用?CountDownLatch 的原理是什么?用过 CountDownLatch 么?什么场景下用的
CyclicBarrier 有什么用?CyclicBarrier 的原理是什么?
JVM
运行时数据区
运行时数据区中包含哪些区域?哪些线程共享?哪些线程独享?哪些区域可能会出现OutOfMemoryError?哪些区域不会出现OutOfMemoryError?
方法区和永久代的关系。
Java 对象的创建过程。
对象的访问定位的两种方式知道吗?各有什么优缺点。
堆空间的基本结构了解吗?什么情况下对象会进入老年代?
垃圾收集
如何判断对象是否死亡(两种方法)
讲一下可达性分析算法的流程。 哪些对象可以作为 GC Roots 呢?
对象可以被回收,就代表一定会被回收吗?
JDK 中有几种引用类型?分别的特点是什么?
垃圾收集有哪些算法,各自的特点?
有哪些常见的 GC?谈谈你对 Minor GC、还有 Full GC 的理解。Minor GC 与 Full GC 分别在什么时候发生? Minor GC 会发生 stop the world 现象吗?
讲一下 CMS 垃圾收集器的四个步骤。CMS 有什么缺点?
并发标记要解决什么问题?并发标记带来了什么问题?如何解决并发扫描时对象消失问题?
G1 垃圾收集器的步骤。有什么缺点?
ZGC 了解吗?
JVM 中的安全点和安全区各代表什么?
类
什么是字节码?类文件结构的组成了解吗?
类的生命周期?类加载的过程了解么?加载这一步主要做了什么事情?初始化阶段中哪几种情况必须对类初始化?
双亲委派模型了解么?如果我们不想用双亲委派模型怎么办?
双亲委派模型有什么好处?双亲委派模型是为了保证一个 Java 类在 JVM 中是唯一的?
JDK 中有哪些默认的类加载器?
性能调优&问题排查
虚拟机基础故障处理工具有哪些?
堆内存相关的 JVM 参数有哪些?你在项目中实际配置过了吗?
你在项目中遇到过 GC 问题吗?怎么分析和解决的?
GC 性能指标了解吗?调优原则呢?
如何降低 Full GC 的频率?
项目中实践过 JVM 调优吗?怎么做的?
MySQL
MySQL 基础架构
说说 MySQL 的架构?
一条 SQL语句在MySQL中的执行过程
MySQL 存储引擎
MySQL 提供了哪些存储引擎?
MySQL 存储引擎架构了解吗?
MyISAM 和 InnoDB 的区别
MySQL 事务
何谓事务?
何谓数据库事务?
ACID 特性指的是什么?
并发事务带来了哪些问题?
不可重复读和幻读区别
SQL 标准定义了哪些事务隔离级别?
MySQL 的默认隔离级别是什么?能解决幻读问题么?
什么是 MVCC?有什么用?原理了解么?
InnoDB 事务隔离级别实现原理
MySQL 锁
表级锁和行级锁了解吗?有什么区别?
行级锁的使用有什么注意事项?
共享锁和排他锁呢?
意向锁有什么作用?
InnoDB 有哪几类行锁?
记录锁(Record Lock)
间隙锁(Gap Lock)
临键锁(Next-key Lock)
MySQL 索引
何为索引?有什么作用?
索引的优缺点
索引的底层数据结构
MySQL 的索引结构为什么使用 B+树?
主键索引和二级索引
聚集索引与非聚集索引
覆盖索引
联合索引
最左前缀匹配原则
创建索引的注意事项有哪些?
MySQL 日志
MySQL 中常见的日志有哪些?
慢查询日志有什么用?
binlog 主要记录了什么?有什么用?
redo log 如何保证事务的持久性?
页修改之后为什么不直接刷盘呢?
binlog 和 redolog 有什么区别?
undo log 如何保证事务的原子性?
性能优化
SQL 优化
慢查询问题排查
Redis
Redis 基础
Redis 有什么作用?为什么要用 Redis/为什么要用缓存?
Redis 除了做缓存,还能做什么?
Redis 可以做消息队列么?
分布式缓存常见的技术选型方案有哪些?
Redis 数据结构
Redis 常用的数据结构有哪些?
使用 Redis 统计网站 UV 怎么做?
使用 Redis 实现一个排行榜怎么做?
Redis 线程模型
Redis 单线程模型了解吗?
Redis6.0 之前为什么不使用多线程?
Redis6.0 之后为何引入了多线程?
Redis 内存管理
Redis 给缓存数据设置过期时间有啥用?
Redis 是如何判断数据是否过期的呢?
过期的数据的删除策略了解么?
Redis 内存淘汰机制了解么?
Redis 持久化机制
怎么保证 Redis 挂掉之后再重启数据可以进行恢复?
什么是 RDB 持久化?
什么是 AOF 持久化?
Redis 4.0 对于持久化机制做了什么优化?
Redis 事务
如何使用 Redis 事务?
Redis 事务支持原子性吗?
Redis 事务还有什么缺陷?
如何解决 Redis 事务的缺陷?
Redis 性能优化
什么是 bigkey?有什么危害?
公司定义的bigKey是多大?
如何发现 bigkey?
如何避免大量 key 集中过期?
什么是 Redis 内存碎片?为什么会有 Redis 内存碎片?
Redis 生产问题
什么是缓存穿透?怎么解决?
什么是缓存雪崩?怎么解决?
如何保证缓存和数据库数据的一致性?
Redis 集群
如何保证 Redis 服务高可用?
Sentinel(哨兵) 有什么作用?
Redis 缓存的数据量太大怎么办?
Redis Cluster 虚拟槽分区有什么优点?
Redis Cluster 中的各个节点是如何实现数据一致性的?
0 条评论
下一页