java基础
面向对象
- 面向对象和面向过程的区别
- 面向对象的三大特征
- 面向对象的五个基本原理
基本数据类型
- 8种基本数据类型
- 整型中byte、short、int、long的取值范围
- 什么是浮点型?
- 什么是单精度和双精度?
- 为什么不能用浮点型表示金额?应该用什么来表示金额
- 基本数据类型对应的包装类型都是什么,为什么需要这些包装类?包装类和基本类型区别在哪里
封装、继承多态
平台无关性
- java是如何做到平台无关的
- JVM还支持什么语言
值传递
- 值传递和引用传递
- 为什么说java中只有值传递
String
- 字符串的不可变性
- String的长度限制
- JDK 6和JDK 7中substring的原理及区别
- replaceFirst、replaceAll、replace区别
- String、StringBuilder和StingBuffer之间的区别与联系
- String对“+”的重载
- 字符串拼接的几种方式和区别
- String.valueOf和Integer.toString的区别
- switch对String的支持
- 字符串池
- 常量池(运行时常量池、Class常量池)
- intern
各种关键字
- transient
- instanceof
- volatile
- synchronized
- final
- static
- const
集合类
- Collection和Collections的区别
- 常用集合类的使用
- Set和List区别
- ArrayList和LinkedList和Vector的区别
- SynchronizedList和Vector的区别
- Set如何保证元素不重复
- HashMap、HashTable、ConcurrentHashMap区别
- Java 8中Map相关的红黑树的引用背景、原理等
- HashMap的容量、扩容、hash等原理
- Java 8中stream相关用法
- Apache集合处理工具类的使用
- 不同版本的JDK中HashMap的实现的区别以及原因
- Arrays.asList获得的List使用时需要注意什么
- Collection如何迭代
- Enumeration和Iterator区别
- 如何在遍历的同时删除ArrayList中的元素
- fail-fast 和 fail-safe
- CopyOnWriteArrayList
- ConcurrentSkipListMap
枚举
- 枚举的用法
- 枚举的实现
- 枚举与单例
- Enum类
- Java枚举如何比较
- switch对枚举的支持
- 枚举的序列化如何实现
- 枚举的线程安全性问题
IO
- 字符流、字节流
- 输入流、输出流
- 字节流和字符流之间的相互转换
- 同步、异步
- 阻塞、非阻塞
- Linux 5种IO模型
- BIO、NIO和AIO的区别
- 三种IO的用法与原理
- netty
反射
- 什么是反射
- 反射有什么作用
- Class类
- java.lang.reflect.*
代理
- 静态代理
- 动态代理
- 动态代理和反射的关系
- 动态代理的几种实现方式
- AOP
序列化
- 什么是序列化与反序列化
- Java如何实现序列化与反序列化
- Serializable 和 Externalizable 有何不同
- 为什么需要序列化
- serialVersionUID
- 为什么serialVersionUID不能随便改
- transient
- 序列化底层原理
- 序列化如何破坏单例模式
- protobuf
- 为什么说序列化并不安全
注解
- 元注解
- 自定义注解
- Java中常用注解使用
- 注解与反射的结合
- 如何自定义一个注解?
- Spring常用注解
泛型
- 什么是泛型
- 类型擦除
- 泛型带来的问题
- 泛型中K T V E ?object等的含义
- 泛型各种用法
- 限定通配符和非限定通配符
- 上下界限定符extends 和 super
- List和原始类型List之间的区别?
- List和List之间的区别是什么?
单元测试
- junit
- junit和Spring的结合
- mock
- mockito
- 内存数据库(h2)
常用的Java工具库
- apache-commons
- google-guava
- netty
API&SPI
- API
- API和SPI的关系和区别
- 如何定义SPI
- SPI的实现原理
异常
- Error和Exception
- 异常类型
- 异常相关关键字
- 正确处理异常
- 自定义异常
- 异常链
- try-with-resources
- finally和return的执行顺序
时间处理
- 时区
- 冬令时和夏令时
- 时间戳
- Java中时间API(Java 8)
- 格林威治时间
- CET、UTC、GMT、CST几种常见时间的含义和关系
- SimpleDateFormat的线程安全性问题
- Java 8中的时间处理
- 如何在东八区的计算机上获取美国时间
- yyyy和YYYY有什么区别?
编码方式
- 什么是ASCII?
- Unicode
- 有了Unicode为啥还需要UTF-8
- UTF8、UTF16、UTF32区别
- 有了UTF8为什么还需要GBK?
- GBK、GB2312、GB18030之间的区别
- URL编解码
- Big Endian和Little Endian
- 如何解决乱码问题
- 语法糖
- Java中语法糖原理、解语法糖
- 常见语法糖原理:switch 支持 String 与枚举、泛型、自动装箱与拆箱、方法变长参数、枚举、内部类、条件编译、 断言、数值字面量、for-each、try-with-resource、Lambda表达式、本地变量类型推断、record
JMS
- 什么是Java消息服务
- JMS消息传送模型
- JMX
- java.lang.management.*
- javax.management.*
Java 8 新特性
- lambda表达式
- Stream API
- 时间API
阅读源代码
- String
- Integer
- Long
- Enum
- BigDecimal
- ThreadLocal
- ClassLoader & URLClassLoader
- ArrayList & LinkedList
- HashMap & LinkedHashMap & TreeMap & CouncurrentHashMap
- HashSet & LinkedHashSet & TreeSet
Java并发编程
- 并发与并行
- 什么是并发
- 什么是并行
- 并发与并行的区别
- 线程
- 线程与进程的区别
- 线程的实现
- 线程的状态
- 线程优先级
- 线程调度
- 多线程如何Debug
- 守护线程
- 创建线程的多种方式
- 继承Thread类创建线程
- 实现Runnable接口创建线程
- 通过Callable和FutureTask创建线程
- 通过线程池创建线程
- 线程池
- 自己设计线程池
- submit() 和 execute()
- 线程池原理
- 为什么不允许使用Executors创建线程池
- 线程安全
- 什么是线程安全
- 多级缓存和缓存一致性问题
- CPU时间片和原子性问题
- 指令重排和有序性问题
- 线程安全和内存模型的关系
- happens-before
- as-if-serial
锁
- 可重入锁
- 阻塞锁
- 乐观锁与悲观锁
- 数据库相关锁机制
- 分布式锁
- 无锁
- CAS
- CAS的ABA问题
- 锁优化
- 偏向锁
- 轻量级锁
- 重量级锁
- 锁消除
- 锁粗化
- 自旋锁
- 死锁
- 什么是死锁
- 死锁的原因
- 如何避免死锁
- 写一个死锁的程序
- 死锁问题如何排查
synchronized
- synchronized是如何实现的?
- synchronized和lock之间关系
- 不使用synchronized如何实现一个线程安全的单例
- synchronized和原子性
- synchronized和可见性
- synchronized和有序性
volatile
- 编译器指令重排和CPU指令重排
- volatile的实现原理
- 内存屏障
- volatile和原子性
- volatile和可见性
- volatile和有序性
- 有了symchronized为什么还需要volatile
线程相关方法
- start & run
- sleep & wait
- notify & notifyAll
- ThreadLocal
- ThreadLocal 原理
- ThreadLocal 底层的数据结构
- 写代码解决生产者消费者问题
并发包
- 同步容器与并发容器
- Thread
- Runnable
- Callable
- ReentrantLock
- ReentrantReadWriteLock
- Atomic*
- Semaphore
- CountDownLatch
- ConcurrentHashMap
- Executors
Spring
- IOC是什么,如何使用
- AOP是什么,如何使用
- bean的生命周期
- 启动流程
- 循环依赖是什么?如何解决?
- 事务
- 注解
SpringBoot
SpringCloud
注册中心
- eureka
- nacos
网关
- gateway
- nacos
消息队列
rocketmq
activemq
rabbitmq
kafka
缓存
- ngnix
- gurna