《Offer来了:Java面试核心知识点精讲(第2版)》是由电子工业出版社出版的一本关于Offer方面的书籍,作者是王磊,主要介绍了关于Offer、Java面试方面的知识内容,目前在Offer类书籍综合评分为:8.6分。
书籍介绍
内容简介
本书讲解Java面试中常被问及的核心知识点,涉及Java基础、Java并发编程、JVM、Java高并发网络编程、Spring基础、Netflix的原理及应用、SpringCloudAlibaba的原理及应用、数据结构、Java中常用算法的原理及其Java实现、关系数据库及分布式事务、分布式缓存的原理及应用、ZooKeeper的原理及应用、Kafka的原理及应用、Elasticsearch的原理及应用、设计模式的概念及其Java实现。
本书内容全面、细致,既可帮助读者迅速查找Java知识点,也可帮助读者完善其Java知识体系;不但可以作为Java面试知识速通手册,也可以作为Java程序员的案头手册。
目录
- 第1章Java基础
- 1.1集合2
- 1.1.1List:可重复2
- 1.1.2Queue3
- 1.1.3Set:不可重复4
- 1.1.4Map5
- 1.2异常的分类及处理8
- 1.2.1异常的概念8
- 1.2.2异常的分类9
- 1.2.3处理异常的方式10
- 1.3反射机制12
- 1.3.1动态语言的概念12
- 1.3.2反射机制的概念12
- 1.3.3反射的应用12
- 1.3.4Java的反射API13
- 1.3.5反射的过程13
- 1.3.6创建对象的两种方式14
- 1.3.7Method的invoke方法15
- 1.4注解16
- 1.4.1注解的概念16
- 1.4.2标准元注解:@Target、@Retention、@Documented、@Inherited16
- 1.4.3注解处理器17
- 1.5内部类19
- 1.5.1静态内部类19
- 1.5.2成员内部类20
- 1.5.3局部内部类21
- 1.5.4匿名内部类21
- 1.6泛型22
- 1.6.1泛型标记和泛型限定:E、T、K、V、N、?23
- 1.6.2泛型方法24
- 1.6.3泛型类25
- 1.6.4泛型接口25
- 1.6.5类型擦除26
- 1.7序列化27
- 1.7.1Java序列化API的应用27
- 1.7.2Kryo序列化29
- 1.7.3Avro序列化31
- 1.7.4ProtoBuf序列化33
- 1.8JavaI/O35
- 1.8.1输入流和输出流35
- 1.8.2字节流和字符流36
- 1.8.3节点流和处理流42
- 1.8.4内存映射文件技术43
- 》》》第2章Java并发编程46《《《
- 2.1常见的Java线程的创建方式47
- 2.1.1继承Thread类47
- 2.1.2实现Runnable接口48
- 2.1.3通过ExecutorService和Callable接口实现有返回值的线程49
- 2.1.4基于线程池50
- 2.2Java线程池的原理50
- 2.2.1线程复用51
- 2.2.2线程池的核心组件和核心类51
- 2.2.3Java线程池的工作流程52
- 2.2.4线程池的拒绝策略53
- 2.35种常用的线程池56
- 2.3.1newCachedThreadPool56
- 2.3.2newFixedThreadPool57
- 2.3.3newScheduledThreadPool57
- 2.3.4newSingleThreadExecutor58
- 2.3.5newWorkStealingPool58
- 2.4线程的生命周期58
- 2.4.1新建状态:New60
- 2.4.2就绪状态:Runnable60
- 2.4.3阻塞状态:Blocked60
- 2.4.4等待状态:Waiting61
- 2.4.5超时等待状态:Timed_Waiting61
- 2.4.6线程终止:Terminated61
- 2.5线程的基本方法61
- 2.5.1线程等待:wait方法62
- 2.5.2线程睡眠:sleep方法62
- 2.5.3线程让步:yield方法62
- 2.5.4线程中断:interrupt方法62
- 2.5.5线程加入:join方法63
- 2.5.6线程唤醒:notify方法64
- 2.5.7后台守护线程:setDaemon方法64
- 2.5.8sleep方法和wait方法的区别65
- 2.5.9start方法和run方法的区别65
- 2.5.10终止线程的4种方式65
- 2.6Java中的锁67
- 2.6.1乐观锁68
- 2.6.2悲观锁68
- 2.6.3自旋锁68
- 2.6.4synchronized69
- 2.6.5ReentrantLock77
- 2.6.6synchronized与ReentrantLock的对比83
- 2.6.7Semaphore83
- 2.6.8AtomicInteger84
- 2.6.9可重入锁85
- 2.6.10公平锁和非公平锁85
- 2.6.11读写锁86
- 2.6.12共享锁和独占锁86
- 2.6.13重量级锁和轻量级锁87
- 2.6.14偏向锁87
- 2.6.15分段锁88
- 2.6.16同步锁和死锁88
- 2.6.17如何进行锁优化88
- 2.7线程上下文切换90
- 2.7.1线程上下文切换的流程90
- 2.7.2导致线程上下文切换的原因91
- 2.8Java中的阻塞队列91
- 2.8.1阻塞队列的主要操作92
- 2.8.2Java中阻塞队列的实现96
- 2.9Java并发关键字101
- 2.9.1CountDownLatch101
- 2.9.2CyclicBarrier103
- 2.9.3Semaphore104
- 2.9.4volatile的作用106
- 2.10多线程如何共享数据108
- 2.10.1将数据抽象成一个类,将对这个数据的操作封装在类的方法中108
- 2.10.2将Runnable对象作为一个类的内部类,将共享数据作为其成员变量109
- 2.11Fork/Join并发框架111
- 2.11.1工作窃取算法111
- 2.11.2Fork/Join框架的应用112
- 2.11.3Fork/Join的核心组件116
- 2.11.4Fork/Join的任务调度流程117
- 2.12Java中的线程调度117
- 2.12.1抢占式调度117
- 2.12.2协同式调度118
- 2.12.3Java线程调度的实现:抢占式119
- 2.12.4线程让出CPU的情况119
- 2.13进程调度算法119
- 2.13.1优先调度算法119
- 2.13.2高优先权优先调度算法120
- 2.13.3时间片的轮转调度算法121
- 2.14CAS122
- 2.14.1CAS的特性:乐观锁123
- 2.14.2CAS自旋等待123
- 2.15ABA问题124
- 2.16AQS124
- 2.16.1AQS的原理125
- 2.16.2state:状态125
- 2.16.3AQS共享资源的方式:独占式和共享式126
- 2.17Java8中的流127
- 2.17.1并行流和串行流的原理128
- 2.17.2流的常用函数130
- 2.17.3流的创建方式131
- 2.17.4流和集合的区别132
- 》》》第3章JVM133《《《
- 3.1JVM结构规范(JavaSE8)134
- 3.2多线程135
- 3.3HotSpotJVM内存模型136
- 3.3.1程序计数器:线程私有,无内存溢出问题137
- 3.3.2Java虚拟机栈:线程私有,描述Java方法的执行过程137
- 3.3.3本地方法栈:线程私有138
- 3.3.4Java堆:线程共享139
- 3.3.5元空间:方法区在HotSpotJVM中的实现,线程共享139
- 3.3.6直接内存139
- 3.4HotSpotJVM堆140
- 3.4.1新生代:Eden区、SurvivorTo区和SurvivorFrom区140
- 3.4.2老年代141
- 3.5垃圾回收的原理与算法142
- 3.5.1如何确定垃圾142
- 3.5.2如何回收垃圾143
- 3.6Java中的4种引用类型147
- 3.7分代回收算法和分区回收算法148
- 3.7.1分代回收算法148
- 3.7.2分区回收算法148
- 3.8垃圾回收器149
- 3.8.1Serial垃圾回收器:单线程,复制算法150
- 3.8.2ParNew垃圾回收器:多线程,复制算法150
- 3.8.3ParallelScavenge垃圾回收器:多线程,复制算法150
- 3.8.4SerialOld垃圾回收器:单线程,标记整理算法150
- 3.8.5ParallelOld垃圾回收器:多线程,标记整理算法151
- 3.8.6CMS垃圾回收器152
- 3.8.7G1垃圾回收器152
- 3.9JVM的参数配置153
- 3.9.1JVM参数设置入门案例153
- 3.9.2JVM参数设置实战154
- 3.10JVM的类加载机制156
- 3.10.1JVM的类加载阶段156
- 3.10.2类加载器158
- 3.10.3双亲委派机制159
- 3.10.4OSGI160
- 3.11JVM的性能监控与分析工具161
- 3.11.1jps161
- 3.11.2jinfo162
- 3.11.3jstat162
- 3.11.4jstack163
- 3.11.5jmap164
- 3.11.6GC日志分析166
- 》》》第4章Java高并发网络编程168《《《
- 4.1网络169
- 4.1.1OSI七层网络模型169
- 4.1.2TCP/IP四层网络模型170
- 4.1.3TCP三次握手/四次挥手171
- 4.1.4HTTP的原理176
- 4.1.5CDN的原理180
- 4.2负载均衡182
- 4.2.1四层负载均衡与七层负载均衡的对比182
- 4.2.2负载均衡算法184
- 4.2.3LVS的原理及应用186
- 4.2.4Nginx反向代理与负载均衡193
- 4.3Java的网络编程模型195
- 4.3.1阻塞I/O模型195
- 4.3.2非阻塞I/O模型195
- 4.3.3多路复用I/O模型196
- 4.3.4信号驱动I/O模型197
- 4.3.5异步I/O模型197
- 4.3.6JavaI/O模型与JavaNIO模型198
- 4.4Reactor线程模型204
- 4.4.1Reactor单线程模型204
- 4.4.2Reactor多线程模型205
- 4.4.3Reactor主备多线程模型206
- 4.5Netty的架构207
- 4.5.1Netty的架构设计207
- 4.5.2Netty的核心组件210
- 4.5.3Netty的原理211
- 4.5.4Netty的特性214
- 4.5.5Netty实战216
- 4.6租约机制224
- 4.6.1租约机制的概念224
- 4.6.2租约机制解决的问题225
- 4.6.3租约机制的时钟同步问题232
- 4.6.4租约机制在HDFS、HBase、Eureka及Ethd中的应用233
- 4.6.5租约机制的特性236
- 4.7流控算法:固定容器算法、漏桶算法和令牌桶算法236
- 4.8gRPC简介243
- 4.8.1RPC的原理243
- 4.8.2gRPC的原理245
- 4.9高并发知识247
- 4.9.1高并发的核心指标247
- 4.9.2高并发系统的设计原则247
- 4.9.3高可用系统的设计原则249
- 4.9.4Linux操作系统优化250
- 》》》第5章Spring基础252《《《
- 5.1Spring的原理253
- 5.2Spring的特性253
- 5.3Spring的核心JAR包254
- 5.4Spring的注解255
- 5.5SpringIoC的原理257
- 5.5.1SpringIoC简介257
- 5.5.2SpringBean的装配流程258
- 5.5.3SpringBean的作用域258
- 5.5.4SpringBean的生命周期259
- 5.6SpringAOP的原理261
- 5.6.1SpringAOP的核心概念262
- 5.6.2SpringAOP的两种代理方式262
- 5.6.3SpringAOP的5种通知类型263
- 5.6.4SpringAOP的代码实现263
- 5.7SpringMVC的原理264
- 5.8MyBatis的缓存265
- 5.8.1MyBatis的一级缓存原理266
- 5.8.2MyBatis的二级缓存原理266
- 》》》第6章Netflix的原理及应用268《《《
- 6.1微服务架构的优缺点及组成269
- 6.2Netflix技术栈271
- 6.3SpringBoot273
- 6.4Config276
- 6.4.1Config的原理276
- 6.4.2ConfigServer的定义及应用277
- 6.4.3ConfigClient的定义及应用279
- 6.5Eureka280
- 6.5.1Eureka的原理281
- 6.5.2Eureka的应用283
- 6.6Consul290
- 6.6.1Consul的原理290
- 6.6.2Consul的应用293
- 6.7Feign298
- 6.7.1Feign的应用299
- 6.7.2Feign的常用注解301
- 6.8Hystrix301
- 6.8.1Hystrix的特性302
- 6.8.2Hystrix的服务降级流程304
- 6.8.3Hystrix的应用305
- 6.8.4异步请求307
- 6.8.5Hystrix的常用配置311
- 6.8.6HystrixDashboard313
- 6.9Zuul314
- 6.9.1Zuul的原理315
- 6.9.2Zuul的应用316
- 6.9.3PreRequestFilter的定义和注入318
- 6.9.4FallbackProvider的服务容错319
- 6.10SpringCloud的链路监控321
- 6.10.1SleuthZipkin321
- 6.10.2Pinpoint327
- 》》》第7章SpringCloudAlibaba的原理及应用333《《《
- 7.1SpringCloudAlibaba概览334
- 7.2Dubbo334
- 7.2.1角色335
- 7.2.2部署架构336
- 7.2.3流量管理337
- 7.2.4总体架构338
- 7.2.5容错模式339
- 7.2.6客户端的负载均衡策略340
- 7.2.7服务降级341
- 7.2.8Dubbo实战342
- 7.3Nacos345
- 7.3.1Nacos的基本架构346
- 7.3.2Nacos的配置中心346
- 7.3.3Nacos服务注册与发现实战348
- 7.4Sentinel352
- 7.4.1Sentinel的原理353
- 7.4.2Sentinel的应用357
- 》》》第8章数据结构360《《《
- 8.1栈及其Java实现361
- 8.2队列及其Java实现364
- 8.3链表366
- 8.3.1链表的特性367
- 8.3.2单向链表及其Java实现367
- 8.3.3双向链表及其Java实现370
- 8.3.4循环链表及其Java实现374
- 8.4跳跃表374
- 8.5哈希表376
- 8.5.1常用的构造哈希函数377
- 8.5.2哈希表的应用377
- 8.6二叉排序树378
- 8.6.1插入操作378
- 8.6.2删除操作379
- 8.6.3查找操作381
- 8.6.4用Java实现二叉排序树381
- 8.7红黑树385
- 8.7.1红黑树的特性385
- 8.7.2红黑树的左旋386
- 8.7.3红黑树的右旋386
- 8.7.4红黑树的添加387
- 8.7.5红黑树的删除388
- 8.8图389
- 8.8.1无向图和有向图389
- 8.8.2图的存储结构:邻接矩阵390
- 8.8.3图的存储结构:邻接表392
- 8.8.4图的遍历393
- 8.9位图394
- 8.9.1位图的数据结构394
- 8.9.2位图的Java实现395
- 》》》第9章Java中常用算法的原理及其Java实现398《《《
- 9.1二分查找算法399
- 9.2冒泡排序算法400
- 9.3插入排序算法402
- 9.4快速排序算法404
- 9.5希尔排序算法406
- 9.6归并排序算法408
- 9.7桶排序算法411
- 9.8基数排序算法412
- 9.9其他算法415
- 9.9.1剪枝算法415
- 9.9.2回溯算法416
- 9.9.3短路径算法416
- 》》》第10章关系数据库及分布式事务418《《《
- 10.1数据库基础419
- 10.1.1存储引擎419
- 10.1.2创建索引的原则421
- 10.1.3数据库三范式422
- 10.1.4存储过程423
- 10.1.5触发器424
- 10.2数据库的并发操作和锁424
- 10.2.1数据库的并发策略424
- 10.2.2数据库锁425
- 10.2.3数据库分库分表427
- 10.3事务428
- 10.3.1本地事务429
- 10.3.2分布式事务430
- 10.3.3CAP431
- 10.3.4两阶段提交431
- 10.3.5三阶段提交433
- 10.3.6柔性事务434
- 10.4MySQL的高可用与高并发436
- 10.4.1MySQL的主备复制437
- 10.4.2MySQL双主模式的循环复制问题440
- 10.4.3MySQL的索引440
- 10.5大表水平拆分442
- 10.5.1按照范围分表442
- 10.5.2哈希取模442
- 10.5.3一致性哈希算法443
- 10.6NWR理论446
- 》》》第11章分布式缓存的原理及应用448《《《
- 11.1分布式缓存简介449
- 11.2Ehcache的原理及应用450
- 11.2.1Ehcache的原理450
- 11.2.2Ehcache的应用452
- 11.3Redis的原理及应用454
- 11.3.1Redis的原理454
- 11.3.2Redis的应用467
- 11.4分布式缓存设计的核心问题470
- 11.4.1缓存预热470
- 11.4.2缓存更新470
- 11.4.3缓存淘汰策略471
- 11.4.4缓存雪崩471
- 11.4.5缓存穿透471
- 11.4.6缓存降级472
- 11.5分布式缓存的应用场景473
- 》》》第12章ZooKeeper、Kafka的原理及应用475《《《
- 12.1ZooKeeper的原理476
- 12.1.1ZooKeeper中的角色476
- 12.1.2ZAB协议477
- 12.1.3ZooKeeper的选举机制和流程479
- 12.2ZooKeeper的应用480
- 12.2.1ZooKeeper的数据模型480
- 12.2.2ZooKeeper的应用场景482
- 12.3Kafka的原理484
- 12.3.1Kafka的组成484
- 12.3.2Kafka的数据存储设计486
- 12.3.3生产者并发设计488
- 12.3.4消费者并发设计490
- 12.3.5Kafka控制器选主491
- 12.3.6Kafka分区Leader选主492
- 12.3.7KafkaTopic的删除流程493
- 12.3.8Kafka消息的幂等性494
- 12.3.9Kafka服务端的核心参数494
- 12.3.10Kafka生产者的核心参数495
- 12.3.11Kafka消费者的核心参数496
- 》》》第13章HBase的原理及应用498《《《
- 13.1HBase的原理499
- 13.1.1HBase的概念499
- 13.1.2行式存储和列式存储500
- 13.1.3LSM树502
- 13.1.4布隆过滤器(BloomFilter)505
- 13.1.5HBase列式存储的数据模型506
- 13.1.6HBase的核心架构507
- 13.1.7HBase的数据读写流程511
- 13.1.8HBaseCompation514
- 13.1.9HBaseRegion的分裂515
- 13.1.10HBaseRegion的合并517
- 13.1.11HBaseRegion的负载均衡517
- 13.2HBase的高性能集群配置518
- 13.2.1HBase的硬件配置选型518
- 13.2.2HBase的配置优化519
- 13.2.3HBase的日常运维523
- 》》》第14章Elasticsearch的原理及应用525《《《
- 14.1Elasticsearch的概念和原理526
- 14.1.1Lucene简介526
- 14.1.2Elasticsearch的特性530
- 14.1.3Elasticsearch的应用场景530
- 14.1.4Elasticsearch的数据模型531
- 14.1.5Elasticsearch的分布式架构533
- 14.1.6Elasticsearch的写操作538
- 14.1.7Elasticsearch的读操作540
- 14.1.8Elasticsearch中的Translog541
- 14.1.9Elasticsearch的段合并543
- 14.1.10Elasticsearch的集群扩容544
- 14.2Elasticsearch的配置和性能调优545
- 》》》第15章设计模式的概念及其Java实现546《《《
- 15.1设计模式简介547
- 15.2工厂模式550
- 15.3抽象工厂模式552
- 15.4单例模式557
- 15.5建造者模式559
- 15.6原型模式563
- 15.7适配器模式566
- 15.8装饰者模式571
- 15.9代理模式573
- 15.10外观模式575
- 15.11桥接模式579
- 15.12组合模式582
- 15.13享元模式584
- 15.14策略模式587
- 15.15模板方法模式590
- 15.16观察者模式592
- 15.17迭代器模式595
- 15.18责任链模式599
- 15.19命令模式602
- 15.20备忘录模式605
- 15.21状态模式608
- 15.22访问者模式610
- 15.23中介者模式614
- 15.24解释器模式618