最近更新:2020年3月15日22:39:25
本篇博客是对我的专栏《Java面试复习笔记》的一个索引
(内容持续更新!!!)(后续学习了继续补充)
专栏的内容包括了我在诸多付费课程中学习的关于Java面试的笔记和总结
其中的课程包含了
- 慕课网《玩转Java并发工具,精通JUC,成为并发多面手》
- 慕课网《Java并发核心知识体系精讲》
- 慕课网《剑指Java面试-Offer直通车》
- 慕课网《高薪之路–Java面试题精选集》
- 慕课网《面试官系统精讲Java源码及大厂真题》
- 拉勾网《Java 面试真题及源码 34 讲》
- 牛客网《Java开发岗高频面试题全解析》
- 极客时间《极客时间-Java核心技术36讲》
- 极客时间《SQL必知必会》
希望这个专栏除了能帮助我自己构建知识体系,掌握面试的知识,同时也能帮助和我一样在学校没有学到太多实用东西想要找大厂工作的同学
并发编程篇
你必须了解的Java并发核心知识
内容包含->
- 进程和线程的区别
- Java进程与线程的关系
- 有多少种实现线程的方法?
- 实现Runnable接口和继承Thread类哪种方式更好?
- 一个线程两次调用start()方***出现什么情况?为什么?
- 既然start()方***调用run方法,为什么我们选择调用start方法而不是直接调用run方法呢?
- 如何停止线程?
- 如何处理不可中断的阻塞
- 线程有哪几种状态?生命周期是什么?
- 用程序实现两个线程交替打印(0-100)的奇偶数
- 什么是生产者消费者模式
- 手写生产者消费者模式
- 为什么wait方法需要在同步代码块内使用,而sleep不需要
- 为什么线程通信的方法wait、notify、notifyAll被定义在Object类中?而slepp方法被定义在Thread类中?
- wait方法是属于Object对象的,那调用Thread.wait()会怎么样
- 如何选择用notify还是notifyAll
- notifyAll之后所有的线程都会再次抢夺锁,如果某线程抢夺失- 败怎么办?
- suspend和resume来阻塞线程可以吗?为什么?
- wait/notify、sleep异同
- yield和sleep的区别
- 在join期间,线程处于哪种线程状态?
- 守护线程和普通线程的区别
- 我们是否需要给线程设置守护线程?
- run方法是否可以抛出异常?
- 如何全局处理异常
- 什么是多线程的上下文切换
- 为什么多线程会带来性能问题?
- 何时会导致密集的上下文切换
- 单例模式的作用和适用场景
- 单例模式的八种写法及相关知识点
- 工作中哪种单例模式的实现最好
- 讲一讲什么是Java内存模型
- 关于死锁你知道多少?
讲一讲什么是Java内存模型
内容包含->
- 为什么会有Java内存模型?
- 辨析JVM内存结构、Java内存模型、Java对象模型
- JVM内存结构
- Java对象模型
- Java内存模型
- 重排序
- 例子演示:
- 什么是重排序
- 重排序的好处
- 重排序的3种情况
- 可见性
- 什么是可见性问题
- 为什么会有可见性问题
- JMM主内存与本地内存的关系
- happens-before规则有哪些?
- volatile是什么
- 什么时候适合用volatile
- volatile的作用
- volatile与synchronized的关系
- 原子性
- 什么是原子性
- Java中的原子操作有哪些
- 生成对象的过程是不是原子操作?
彻底搞懂死锁的前世今生
内容包含–>
- 死锁是什么,有什么危害?
- 写一个死锁的例子
- 案例一:必然发生死锁
- 案例二:两个账户转账
- 案例三:多人多次转账
- 发生死锁必须满足哪些条件
- 如何定位死锁
- 有哪些解决死锁问题的策略?
- 线上发生死锁怎么办
- 常见修复策略
- 哲学家就餐问题
- 问题描述
- 代码演示
- 多种解决方案
- 改变一个哲学家拿叉子的顺序的实现
- 工程中如何避免死锁
通过单例模式的8种写法搞定单例模式面试
内容包含–>
- 饿汉式(静态常量)(可用)
- 饿汉式(静态代码块)(可用)
- 懒汉式(线程不安全)(不可用)
- 懒汉式(线程安全)(不推荐)
- 懒汉式(加锁,线程不安全)(不可用)
- 双重检查(推荐面试使用)(可用)
- 静态内部类(推荐用)(可用)
- 枚举(推荐用)(可用)(生产中最佳写法)
ThreadLocal你知道多少?
直达链接
内容包含->
- ThreadLocal典型应用场景
- 场景1:每个线程需要一个独享的对象
- 场景2:当前用户信息需要被线程内所有方法共享
- ThreadLocal的两个作用
- 两种初始化方法使用场景
- 使用ThreadLocal的好处
- ThreadLocal与Thread的关系
- ThreadLocal的重要方法
- ThreadLocal注意点
- ThreadLocal 为什么会发生内存溢出?
如何解决内存溢出
不得不说的“锁”事
内容包含->
- Lock接口
- 简介
- 为什么需要Lock
- 方法介绍
- 可见性保证
- 锁的分类
- 乐观锁和悲观锁
- 为什么会诞生非互斥同步锁(乐观锁)
- 什么是乐观锁和悲观锁
- 典型例子
- 开销对比
- 使用场景
- 可重入锁和非可重入锁
- 公平锁和非公平锁
- 什么是公平和非公平
- 为什么要有非公平锁
- 公平的情况(以ReentrantLock 为例)
- 不公平的情况(以ReentrantLock 为例)
- 特例
- 对比非公平和公平的优缺点
- 共享锁和排它锁
- 什么是共享锁和排它锁
- 读写锁的作用
- 读写锁的规则
- ReetrantReadWriteLock的具体用法
- 读锁插队策略
- 升降级策略
- 自旋锁和阻塞锁
- 为什么需要自旋锁
- 自旋锁缺点
- 代码演示
- 自旋锁的适用场景
- 可中断锁和不可中断锁
- 乐观锁和悲观锁
- 写代码时如何优化锁并提高并发性能
关于线程池你知道多少?
直达链接
内容包含->
- 线程池的好处
- 线程池适用场合
- 线程池的创建
- 线程池的构造函数的参数
- 添加线程规则
- 增减线程的特点
- 线程池应该手动创建还是自动创建
- 几种常见线程池
- 如何正确停止一个线程池
- 任务太多,怎么拒绝
- 拒绝时机
- 拒绝策略
什么是CAS?
直达链接
内容包含->
- 什么是CAS
- 演示CAS核心原理
- CAS应用场景
- CAS的缺点
再次认识下final关键字和不变性
直达链接
内容包含->
- 什么是不变性
- final的作用
- final的三种用法
- final修饰变量
- final修饰方法
- final修饰类
- 注意点
- 不变性与final的关系
- 栈封闭技术
- 面试题
Java基础篇
谈谈对Java平台的理解
内容包含->
- Java显著特征
- Java的特性
- Java代码执行过程
- Java是解析运行的吗?
String是如何实现的?有哪些重要方法?
直达链接
内容包含->
- String是如何实现的?有哪些重要方法?
- String是如何实现的?
- 常用方法
- 扩展
- 为什么String类型要用final修饰?
- equals和‘==’的区别是什么?
- String 和 StringBuilder、StringBuffer 有什么区别?
- String 的intern()方法有什么含义?
- String类型在JVM中如何存储的?编译器做过哪些优化?
面向对象可以解释下吗?都有哪些特性?
直达链接
内容包含->
- 面对对象思想
- 关于封装
- 关于继承
- 关于多态
- 关于覆盖
- 关于重载
Java中的Exception和Error有什么区别?
内容包含->
- 概念
- Exception分类
- NoClassDefFoundError 和 ClassNotFoundException 有什么区别?
- Throwable、Error和Exception之间的层次
- 分析异常处理的不当
- 案例一
- 分析
- 案例二
- 分析
- finally相关考点
- finally不会被执行的情况
- finally执行对结果造成的影响
int和Integet有什么区别?
直达链接
内容包含->
- int和Integet有什么区别
- Java的8中原始数据类型和对应的包装类
- Java的自动拆装箱
强引用、软引用、弱引用、幻象引用有什么区别?
抽象类和接口有什么区别?
直达链接
内容包含->
- 概念
- 区别
- 接口和抽象类如何选择?分别在什么情况下使用?
- JDK8为什么在接口中出现default类型的方法?
JDK,JRE和JVM的区别与联系有哪些?
直达链接
内容包含->
- 概念
- 区别与联系
- Java语言的平台无关性是如何实现的?
- Java语言是编译型还是解释型语言?
数据库篇
一篇文章搞懂SQL在Oracle和MySQL中是如何执行的
直达链接
内容包含->
- Oracle中的SQL是如何执行的
- Oracle中应该多使用硬解析还是软解析呢?
- MySQL中的SQL是如何执行的
- MySQL与Oracle执行的区别
算法篇
动图加代码 轻松搞定十大排序算法
直达链接
内容包含->
- 各类排序算法的对比与分类
- 选择排序
- 单向选择
- 双向选择
- 插入排序
- 依次交换
- 依次覆盖
- 冒泡排序
- 常规冒泡
- 优化冒泡
- 希尔排序
- 归并排序
- 快速排序
- 普通快速排序
- 随机快速排序
- 双路快速排序
- 三路快速排序
- 堆排序
- 优先队列
- 原地堆
- 计数排序
- 桶排序
- 基数排序