主编推荐语
本书详细介绍了Java架构师在BAT和移动互联网公司面试中常被问及的核心知识。
内容简介
本书和市场上类似的书最大的区别在与不拖泥带水,力求精简。对Java基础概念笔者认为作为高级Java研发工程师或者架构师均已了解,因此不做过多的解释,以免分散读者对难点的理解。因为在一般高级职位的面试中要求面试管在2个小时内对面试人员做全面的知识结构的了解,如果面试者回答问题拖泥带水不能直击问题本质,很难在短暂时间内完成作答,最后影响面试结果。本书主要包括JVM原理、Java集合、Java多并发编程、Java基础知识、Spring原理、微服务原理和应用、Netty和RPC、网络架构、日志框架、负载均衡、数据库理论和应用、常用一致性算法、Java常用数据结构、Java常用算法、常用加解密算法、分布式缓存常见问题及解决方案、ZooKeepr、Kafka、Rebbitmq、Storm、HBase、Cassandra、Hadoop、Spark、云计算概念。
对于Java基础知识本书以介绍核心知识为主,常用概念不做过多赘述。对于应用部分,如Spring,ZooKeeper、Kafka等本书以讲解原理为主,因为大部分工程师在项目中都用过,但是对其原理不是很了解,导致面试中被来应该知道的问题不能做到系统的回答。
目录
- 版权信息
- 前言
- 章节架构
- 阅读建议
- 致谢
- 第1章 JVM
- 1.1 JVM的运行机制
- 1.2 多线程
- 1.3 JVM的内存区域
- 1.3.1 程序计数器:线程私有,无内存溢出问题
- 1.3.2 虚拟机栈:线程私有,描述Java方法的执行过程
- 1.3.3 本地方法区:线程私有
- 1.3.4 堆:也叫作运行时数据区,线程共享
- 1.3.5 方法区:线程共享
- 1.4 JVM的运行时内存
- 1.4.1 新生代:Eden区、ServivorTo区和ServivorFrom区
- 1.4.2 老年代
- 1.4.3 永久代
- 1.5 垃圾回收与算法
- 1.5.1 如何确定垃圾
- 1.引用计数法
- 2.可达性分析
- 1.5.2 Java中常用的垃圾回收算法
- 1.标记清除算法
- 2.复制算法
- 3.标记整理算法
- 4.分代收集算法
- 1.6 Java中的4种引用类型
- 1.7 分代收集算法和分区收集算法
- 1.7.1 分代收集算法
- 1.新生代与复制算法
- 2.老年代与标记整理算法
- 1.7.2 分区收集算法
- 1.8 垃圾收集器
- 1.8.1 Serial垃圾收集器:单线程,复制算法
- 1.8.2 ParNew垃圾收集器:多线程,复制算法
- 1.8.3 Parallel Scavenge垃圾收集器:多线程,复制算法
- 1.8.4 Serial Old垃圾收集器:单线程,标记整理算法
- 1.8.5 Parallel Old垃圾收集器:多线程,标记整理算法
- 1.8.6 CMS垃圾收集器
- 1.8.7 G1垃圾收集器
- 1.9 Java网络编程模型
- 1.9.1 阻塞I/O模型
- 1.9.2 非阻塞I/O模型
- 1.9.3 多路复用I/O模型
- 1.9.4 信号驱动I/O模型
- 1.9.5 异步I/O模型
- 1.9.6 Java I/O
- 1.9.7 Java NIO
- 1. Channel
- 2. Buffer
- 3. Selector
- 4. Java NIO使用
- 1.10 JVM的类加载机制
- 1.10.1 JVM的类加载阶段
- 1.加载
- 2.验证
- 3.准备
- 4.解析
- 5.初始化
- 1.10.2 类加载器
- 1.10.3 双亲委派机制
- 1.10.4 OSGI
- 第2章 Java基础
- 2.1 集合
- 2.1.1 List:可重复
- 1.ArrayList:基于数组实现,增删慢,查询快,线程不安全
- 2.Vector:基于数组实现,增删慢,查询快,线程安全
- 3.LinkedList:基于双向链表实现,增删快,查询慢,线程不安全
- 2.1.2 Queue
- 2.1.3 Set:不可重复
- 1.HashSet:HashTable实现,无序
- 2.TreeSet:二叉树实现
- 3.LinkHashSet:HashTable实现数据存储,双向链表记录顺序
- 2.1.4 Map
- 1.HashMap:数组+链表存储数据,线程不安全
- 2.ConcurrentHashMap:分段锁实现,线程安全
- 3.HashTable:线程安全
- 4.TreeMap:基于二叉树数据结构
- 5.LinkedHashMap:基于HashTable数据结构,使用链表保存插入顺序
- 2.2 异常分类及处理
- 2.2.1 异常的概念
- 2.2.2 异常分类
- 2.2.3 异常处理方式:抛出异常、使用try catch捕获并处理异常
- 2.3 反射机制
- 2.3.1 动态语言的概念
- 2.3.2 反射机制的概念
- 2.3.3 反射的应用
- 2.3.4 Java的反射API
- 2.3.5 反射的步骤
- 2.3.6 创建对象的两种方式
- 2.3.7 Method的invoke方法
- 2.4 注解
- 2.4.1 注解的概念
- 2.4.2 标准元注解:@Target、@Retention、@Documented、@Inherited
- 2.4.3 注解处理器
- 1.定义注解接口
- 2.使用注解接口
- 3.定义注解处理器
- 2.5 内部类
- 2.5.1 静态内部类
- 2.5.2 成员内部类
- 2.5.3 局部内部类
- 2.5.4 匿名内部类
- 2.6 泛型
- 2.6.1 泛型标记和泛型限定:E、T、K、V、N、?
- 1.对泛型上限的限定:<? extends T>
- 2.对泛型下限的限定:<? super T>
- 2.6.2 泛型方法
- 2.6.3 泛型类
- 2.6.4 泛型接口
- 2.6.5 类型擦除
- 2.7 序列化
- 2.7.1 Java序列化API的使用
- 2.7.2 序列化和反序列化
- 第3章 Java并发编程
- 3.1 Java线程的创建方式
- 3.1.1 继承Thread类
- 3.1.2 实现Runnable接口
- 3.1.3 通过ExecutorService和Callable<Class>实现有返回值的线程
- 3.1.4 基于线程池
- 3.2 线程池的工作原理
- 3.2.1 线程复用
- 3.2.2 线程池的核心组件和核心类
- 3.2.3 Java线程池的工作流程
- 3.2.4 线程池的拒绝策略
- 1. AbortPolicy
- 2. CallerRunsPolicy
- 3. DiscardOldestPolicy
- 4. DiscardPolicy
- 5.自定义拒绝策略
- 3.3 5种常用的线程池
- 3.3.1 newCachedThreadPool
- 3.3.2 newFixedThreadPool
- 3.3.3 newScheduledThreadPool
- 3.3.4 newSingleThreadExecutor
- 3.3.5 newWorkStealingPool
- 3.4 线程的生命周期
- 3.4.1 新建状态:New
- 3.4.2 就绪状态:Runnable
- 3.4.3 运行状态:Running
- 3.4.4 阻塞状态:Blocked
- 3.4.5 线程死亡:Dead
- 3.5 线程的基本方法
- 3.5.1 线程等待:wait方法
- 3.5.2 线程睡眠:sleep方法
- 3.5.3 线程让步:yield方法
- 3.5.4 线程中断:interrupt方法
- 3.5.5 线程加入:join方法
- 3.5.6 线程唤醒:notify方法
- 3.5.7 后台守护线程:setDaemon方法
- 3.5.8 sleep方法与wait方法的区别
- 3.5.9 start方法与run方法的区别
- 3.5.10 终止线程的4种方式
- 1.正常运行结束
- 2.使用退出标志退出线程
- 3.使用Interrupt方法终止线程
- 4.使用stop方法终止线程:不安全
- 3.6 Java中的锁
- 3.6.1 乐观锁
- 3.6.2 悲观锁
- 3.6.3 自旋锁
- 1.自旋锁的优缺点
- 2.自旋锁的时间阈值
- 3.6.4 synchronized
- 1.synchronized的作用范围
- 2.synchronized的用法简介
- 3.synchronized的实现原理
- 3.6.5 ReentrantLock
- 1.ReentrantLock的用法
- 2.ReentrantLock如何避免死锁:响应中断、可轮询锁、定时锁
- 3.Lock接口的主要方法
- 4.公平锁与非公平锁
- 5.tryLock、lock和lockInterruptibly的区别
- 3.6.6 synchronized和ReentrantLock的比较
- 3.6.7 Semaphore
- 3.6.8 AtomicInteger
- 3.6.9 可重入锁
- 3.6.10 公平锁与非公平锁
- 3.6.11 读写锁:ReadWriteLock
- 3.6.12 共享锁和独占锁
- 3.6.13 重量级锁和轻量级锁
- 3.6.14 偏向锁
- 3.6.15 分段锁
- 3.6.16 同步锁与死锁
- 3.6.17 如何进行锁优化
- 1.减少锁持有的时间
- 2.减小锁粒度
- 3.锁分离
- 4.锁粗化
- 5.锁消除
- 3.7 线程上下文切换
- 3.7.1 上下文切换
- 3.7.2 引起线程上下文切换的原因
- 3.8 Java阻塞队列
- 3.8.1 阻塞队列的主要操作
- 1.插入操作
- 2.获取数据操作
- 3.8.2 Java中的阻塞队列实现
- 1.ArrayBlockingQueue
- 2.LinkedBlockingQueue
- 3.PriorityBlockingQueue
- 4.DelayQueue
- 5.SynchronousQueue
- 6.LinkedTransferQueue
- 7.LinkedBlockingDeque
- 3.9 Java并发关键字
- 3.9.1 CountDownLatch
- 3.9.2 CyclicBarrier
- 3.9.3 Semaphore
- 3.9.4 volatile关键字的作用
- 3.10 多线程如何共享数据
- 3.10.1 将数据抽象成一个类,并将对这个数据的操作封装在类的方法中
- 3.10.2 将Runnable对象作为一个类的内部类,将共享数据作为这个类的成员变量
- 3.11 ConcurrentHashMap并发
- 3.11.1 减小锁粒度
- 3.11.2 ConcurrentHashMap的实现
- 3.12 Java中的线程调度
- 3.12.1 抢占式调度
- 3.12.2 协同式调度
- 3.12.3 Java线程调度的实现:抢占式
- 3.12.4 线程让出CPU的情况
- 3.13 进程调度算法
- 3.13.1 优先调度算法
- 1.先来先服务调度算法
- 2.短作业优先调度算法
- 3.13.2 高优先权优先调度算法
- 1.非抢占式优先调度算法
- 2.抢占式优先调度算法
- 3.高响应比优先调度算法
- 3.13.3 时间片的轮转调度算法
- 1.时间片轮转法
- 2.多级反馈队列调度算法
- 3.14 什么是CAS
- 3.14.1 CAS的概念:比较并交换
- 3.14.2 CAS的特性:乐观锁
- 3.14.3 CAS自旋等待
- 3.15 ABA问题
- 3.16 什么是AQS
- 3.16.1 AQS的原理
- 3.16.2 state:状态
- 3.16.3 AQS共享资源的方式:独占式和共享式
- 第4章 数据结构
- 4.1 栈及其Java实现
- 4.2 队列及其Java实现
- 4.3 链表
- 4.3.1 链表的特点
- 4.3.2 单向链表的操作及其Java实现
- 1.单向链表的操作
- 2.单向链表的Java实现
- 4.3.3 双向链表及其Java实现
- 4.3.4 循环链表
- 4.4 散列表
- 4.4.1 常用的构造散列函数
- 4.4.2 Hash的应用
- 4.5 二叉排序树
- 4.5.1 插入操作
- 4.5.2 删除操作
- 4.5.3 查找操作
- 4.5.4 用Java实现二叉排序树
- 4.6 红黑树
- 4.6.1 红黑树的特性
- 4.6.2 红黑树的左旋
- 4.6.3 红黑树的右旋
- 4.6.4 红黑树的添加
- 4.6.5 红黑树的删除
- 4.7 图
- 4.7.1 无向图和有向图
- 4.7.2 图的存储结构:邻接矩阵
- 1.无向图的邻接矩阵
- 2.有向图的邻接矩阵
- 3.带权重图的邻接矩阵
- 4.7.3 图的存储结构:邻接表
- 1.无向图的邻接表结构
- 2.带权值的网图连接表结构
- 4.7.4 图的遍历
- 1.广度优先遍历
- 2.深度优先遍历
- 4.8 位图
- 4.8.1 位图的数据结构
- 4.8.2 位图的Java实现
- 1.数据结构的定义
- 2.查询方法的实现
- 3.修改方法的实现
- 第5章 Java中的常用算法
- 5.1 二分查找算法
- 5.1.1 二分查找算法的原理
- 5.1.2 二分查找算法的Java实现
- 5.2 冒泡排序算法
- 5.2.1 冒泡排序算法的原理
- 5.2.2 冒泡排序算法的Java实现
- 5.3 插入排序算法
- 5.3.1 插入排序算法的原理
- 5.3.2 插入排序算法的Java实现
- 5.4 快速排序算法
- 5.4.1 快速排序算法的原理
- 5.4.2 快速排序算法的Java实现
- 5.5 希尔排序算法
- 5.5.1 希尔排序算法的原理
- 5.5.2 希尔排序算法的Java实现
- 5.6 归并排序算法
- 5.6.1 归并排序算法的原理
- 5.6.2 归并排序算法的Java实现
- 5.7 桶排序算法
- 5.7.1 桶排序算法的原理
- 5.7.2 桶排序算法的Java实现
- 5.8 基数排序算法
- 5.8.1 基数排序算法的原理
- 5.8.2 基数排序算法的Java实现
- 5.9 其他算法
- 5.9.1 剪枝算法
- 5.9.2 回溯算法
- 5.9.3 最短路径算法
- 第6章 网络与负载均衡
- 6.1 网络
- 6.1.1 OSI七层网络模型
- 6.1.2 TCP/IP四层网络模型
- 6.1.3 TCP三次握手/四次挥手
- 1.TCP的数据包结构
- 2.TCP中的三次握手
- 3.TCP中的四次挥手
- 6.1.4 HTTP的原理
- 1.HTTP的传输流程
- 2.HTTP中的常见状态码
- 3.HTTPS
- 6.1.5 CDN的原理
- 1.CDN的关键技术
- 2.CDN的主要特点
- 3.内容分发系统
- 4.负载均衡系统
- 5.管理系统
- 6.2 负载均衡
- 6.2.1 四层负载均衡与七层负载均衡的对比
- 1.四层负载均衡
- 2.七层负载均衡
- 6.2.2 负载均衡算法
- 1.轮询均衡(Round Robin)
- 2.权重轮询均衡(Weighted Round Robin)
- 3.随机均衡(Random)
- 4.权重随机均衡(Weighted Random)
- 5.响应速度均衡(Response Time)
- 6.最少连接数均衡(Least Connection)
- 7.处理能力均衡
- 8. DNS响应均衡(Flash DNS)
- 9.散列算法均衡
- 10. IP地址散列
- 11. URL散列
- 6.2.3 LVS的原理及应用
- 1.LVS的原理
- 2.LVS数据转发
- 3.LVS NAT模式
- 4.LVS DR模式
- 5.LVS TUN模式
- 6.LVS FULLNAT模式
- 6.2.4 Nginx反向代理与负载均衡
- 1.upstream_module
- 2.proxy_pass
- 第7章 数据库及分布式事务
- 7.1 数据库的基本概念及原则
- 7.1.1 存储引擎
- 1. MyIASM
- 2. InnoDB
- 3. TokuDB
- 4. Memory
- 7.1.2 创建索引的原则
- 7.1.3 数据库三范式
- 1.第一范式
- 2.第二范式
- 3.第三范式
- 7.1.4 数据库事务
- 7.1.5 存储过程
- 7.1.6 触发器
- 7.2 数据库的并发操作和锁
- 7.2.1 数据库的并发策略
- 1.乐观锁
- 2.悲观锁
- 3.时间戳
- 7.2.2 数据库锁
- 1.行级锁
- 2.表级锁
- 3.页级锁
- 4.基于Redis的分布式锁
- 7.2.3 数据库分表
- 7.3 数据库分布式事务
- 7.3.1 CAP
- 7.3.2 两阶段提交协议
- 1.Prepare(准备阶段)
- 2.Commit(提交阶段)
- 3.两阶段提交的缺点
- 7.3.3 三阶段提交协议
- 1.CanCommit阶段
- 2.PreCommit阶段
- 3.DoCommit阶段
- 7.3.4 分布式事务
- 1.传统事务
- 2.柔性事务
- 第8章 分布式缓存的原理及应用
- 8.1 分布式缓存介绍
- 8.2 Ehcache的原理及应用
- 8.2.1 Ehcache的原理
- 1.Ehcache的特点
- 2.Ehcache的架构
- 3.Ehcache的存储方式
- 4.Ehcache的扩展模块
- 8.2.2 Ehcache的应用
- 8.3 Redis的原理及应用
- 8.3.1 Redis的原理
- 1.Redis的数据类型
- 2.Redis管道
- 3.Redis的事务
- 4.Redis发布、订阅
- 5.Redis集群数据复制的原理
- 6.Redis的持久化
- 7.Redis的集群模式及工作原理
- 8.3.2 Redis的应用
- 1.安装Redis
- 2.应用Redis SpringBoot
- 8.4 分布式缓存设计的核心问题
- 8.4.1 缓存预热
- 8.4.2 缓存更新
- 8.4.3 缓存淘汰策略
- 8.4.4 缓存雪崩
- 8.4.5 缓存穿透
- 8.4.6 缓存降级
- 第9章 设计模式
- 9.1 设计模式简介
- 1.单一职责原则
- 2.开闭原则
- 3.里氏代换原则
- 4.依赖倒转原则
- 5.接口隔离原则
- 6.合成/聚合复用原则
- 7.迪米特法则
- 9.2 工厂模式的概念及Java实现
- 9.3 抽象工厂模式的概念及Java实现
- 9.4 单例模式的概念及Java实现
- 1.懒汉模式(线程安全)
- 2.饿汉模式
- 3.静态内部类
- 4.双重校验锁
- 9.5 建造者模式的概念及Java实现
- 9.6 原型模式的概念及Java实现
- 9.7 适配器模式的概念及Java实现
- 1.类适配器模式
- 2.对象适配器模式
- 3.接口适配器模式
- 9.8 装饰者模式的概念及Java实现
- 9.9 代理模式的概念及Java实现
- 9.10 外观模式的概念及Java实现
- 9.11 桥接模式的概念及Java实现
- 9.12 组合模式的概念及Java实现
- 9.13 享元模式的概念及Java实现
- 9.14 策略模式的概念及Java实现
- 9.15 模板方法模式的概念及Java实现
- 9.16 观察者模式的概念及Java实现
- 9.17 迭代器模式的概念及Java实现
- 9.18 责任链模式的概念及Java实现
- 9.19 命令模式的概念及Java实现
- 9.20 备忘录模式的概念及Java实现
- 9.21 状态模式的概念及Java实现
- 9.22 访问者模式的概念及Java实现
- 9.23 中介者模式的概念及Java实现
- 9.24 解释器模式的概念及Java实现
出版方
电子工业出版社
电子工业出版社成立于1982年10月,是国务院独资、工信部直属的中央级科技与教育出版社,是专业的信息技术知识集成和服务提供商。经过三十多年的建设与发展,已成为一家以科技和教育出版、期刊、网络、行业支撑服务、数字出版、软件研发、软科学研究、职业培训和教育为核心业务的现代知识服务集团。出版物内容涵盖了电子信息技术的各个分支及工业技术、经济管理、科普与少儿、社科人文等领域,综合出版能力位居全国出版行业前列。