流殃的博客

| Comments

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

各种关键字

集合类

  • 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

redis

基本类型

常见异常

常用命令

分布式锁

Comments

评论