内容简介
前言
第1章 Java概述
1.1 Java演进史
1.1.1 Java简史
1.1.2 Java大有可为
1.2 现代Java新特性:从Java 8到Java 12
1.2.1 Java 8新特性
1.2.2 Java 9新特性
1.2.3 Java 10新特性
1.2.4 Java 11新特性
1.2.5 Java 12新特性
1.3 如何来学习本书
1.3.1 学习的前置条件
1.3.2 如何使用本书
1.3.3 如何获取源码
1.4 开发环境配置及编写第一个Java应用
1.4.1 JDK 12的下载
1.4.2 JDK 12的安装
1.4.3 Eclipse的下载
1.4.4 Eclipse的安装
1.4.5 Eclipse的配置
1.4.6 创建Java应用
1.4.7 创建模块
1.4.8 创建Hello World程序
1.4.9 使用JUnit5
第2章 Java语言基础
2.1 变量
2.1.1 命名
2.1.2 基本数据类型
2.1.3 基本数据类型的默认值
2.1.4 字面值(Literal)
2.1.5 基本类型之间的转换
2.1.6 数组(Array)
2.2 运算符
2.2.1 赋值运算符
2.2.2 算术运算符
2.2.3 一元运算符
2.2.4 等价和关系运算符
2.2.5 条件运算符
2.2.6 instanceof运算符
2.2.7 位运算和位移运算符
2.3 表达式、语句和块
2.3.1 表达式
2.3.2 语句
2.3.3 块
2.4 控制流程语句
2.4.1 if-then
2.4.2 if-then-else
2.4.3 switch
2.4.4 while
2.4.5 do-while
2.4.6 for
2.5 枚举类型
2.6 泛型
2.6.1 泛型的作用
2.6.2 泛型类型
2.6.3 泛型方法
2.6.4 有界类型参数
2.6.5 泛型的继承和子类型
2.6.6 通配符
2.6.7 类型擦除
2.6.8 使用泛型的一些限制
2.7 关键字
第3章 面向对象编程基础
3.1 编程的抽象
3.2 类(Class)的示例
3.3 对象的接口(Interface)
3.4 包(Package)
3.5 对象提供服务
3.6 隐藏实现的细节
3.6.1 为啥需要控制对成员的访问
3.6.2 Java的作用域
3.7 实现的重用
3.8 继承
3.8.1 Java中的继承
3.8.2 关于Shape的讨论
3.8.3 实战:继承的示例
3.9 is-a和is-like-a的关系
3.10 多态性(Polymorphism)
3.10.1 多态的定义
3.10.2 理解多态的好处
第4章 集合框架
4.1 集合框架概述
4.1.1 集合框架的定义
4.1.2 Java集合框架的优点
4.1.3 集合框架常见的接口
4.1.4 集合框架的实现
4.2 Collection接口
4.2.1 遍历集合
4.2.2 集合接口批量操作
4.3 Set接口
4.3.1 HashSet、TreeSet和LinkedHashSet的比较
4.3.2 Set接口基本操作
4.3.3 Set接口批量操作
4.4 Map接口
4.4.1 Map接口基本操作
4.4.2 Map接口批量操作
4.4.3 Map集合视图
4.5 List接口
4.5.1 集合操作
4.5.2 位置访问和搜索操作
4.5.3 List的迭代器
4.5.4 范围视图操作
4.5.5 List常用算法
4.6 Queue接口
4.7 Deque接口
4.7.1 插入
4.7.2 移除
4.7.3 检索
第5章 异常处理
5.1 异常捕获与处理
5.1.1 先从一个例子入手
5.1.2 try块
5.1.3 catch块
5.1.4 在一个异常处理程序中处理多个类型的异常
5.1.5 finally块
5.2 通过方法声明异常抛出
5.3 如何抛出异常
5.3.1 throw语句
5.3.2 Throwable类及其子类
5.3.3 Error类
5.3.4 Exception类
5.4 异常链
5.4.1 访问堆栈跟踪信息
5.4.2 记录异常日志
5.5 创建异常类
5.5.1 一个创建异常类的例子
5.5.2 选择超类
5.6 未检查异常
5.7 使用异常带来的优势
5.7.1 将错误处理代码与“常规”代码分离
5.7.2 将错误沿调用推栈向上传递
5.7.3 对错误类型进行分组和区分
5.8 try-with-resources语句
5.8.1 手动关闭资源
5.8.2 Java 7中的try-with-resources介绍
5.8.3 try-with-resources在Java 9中的改进
5.9 实战:使用try-with-resource
第6章 I/O处理
6.1 I/O流
6.1.1 字节流(Byte Streams)
6.1.2 字符流(Character Streams)
6.1.3 面向行的I/O
6.1.4 刷新缓冲流
6.1.5 扫描和格式化文本
6.1.6 命令行I/O
6.1.7 数据流(Data Streams)
6.1.8 对象流(Object Streams)
6.2 文件I/O
6.2.1 路径
6.2.2 Path类
6.2.3 Path的操作
6.2.4 文件操作
6.2.5 检查文件或目录
6.2.6 删除文件或目录
6.2.7 复制文件或目录
6.2.8 移动一个文件或目录
第7章 网络编程
7.1 网络基础
7.1.1 了解OSI参考模型
7.1.2 TCP/IP网络模型与OSI模型的对比
7.1.3 了解TCP
7.1.4 了解UDP
7.1.5 了解端口
7.2 Socket
7.2.1 了解Socket
7.2.2 实战:实现一个echo服务器
7.3 I/O模型的演进
7.3.1 UNIX I/O模型的基本概念
7.3.2 UNIX I/O模型
7.3.3 常见Java I/O模型
7.4 HTTP Client API概述
7.5 HttpRequest
7.6 HttpResponse
7.7 实战:HTTP Client API的使用例子
7.7.1 HTTP Client发起同步请求
7.7.2 发起异步请求
第8章 并发编程
8.1 了解线程
8.1.1 线程的状态
8.1.2 进程和线程
8.1.3 线程和纤程
8.1.4 Java中的线程对象
8.1.5 实战:多线程示例
8.2 并发编程是把双刃剑
8.2.1 死锁(Deadlock)
8.2.2 饥饿(Starvation)
8.2.3 活锁(Livelock)
8.3 解决并发问题的常用方法
8.3.1 同步(Synchronization)
8.3.2 原子访问(Atomic Access)
8.3.3 无锁化设计提升并发能力
8.3.4 缓存提升并发能力
8.3.5 更细颗粒度的并发单元
8.4 守卫块(Guarded Blocks)
8.5 不可变对象(Immutable Object)
8.5.1 一个同步类的例子
8.5.2 定义不可变对象的策略
8.6 高级并发对象
8.6.1 锁对象
8.6.2 执行器
8.6.3 并发集合
8.6.4 原子变量
8.6.5 并发随机数
第9章 基本编程结构的改进
9.1 直接运行Java源代码
9.1.1 Java 11可以执行运行Java源码
9.1.2 原理
9.2 局部变量类型推断
9.2.1 了解var声明变量的一些限制
9.2.2 原理
9.3 实战:var关键字的使用
9.4 字符串处理增强
9.4.1 支持Raw String Literals
9.4.2 原理
9.4.3 限制
9.4.4 Java 11常用String API
9.4.5 Java 12常用String API
9.5 实战:Java 11字符串的使用
9.5.1 Raw String Literals的使用
9.5.2 String API的使用
9.6 支持Unicode标准
9.6.1 了解Unicode 10
9.6.2 在控制台打印出Emoji
9.6.3 在GUI中显示出Emoji
9.7 Optional
9.7.1 复现NullPointerException
9.7.2 Optional类的魔法
9.7.3 Optional类的其他方法
9.8 接口中的默认方法
9.9 实战:接口中的默认方法的使用
9.10 接口中的静态方法
9.11 实战:接口中的静态方法的使用
9.12 Switch表达式增强
9.12.1 实战:Switch表达式的例子
9.12.2 使用Switch表达式的注意事项
9.13 紧凑数字格式
第10章 垃圾回收器的增强
10.1 了解G1
10.1.1 了解Java垃圾回收机制
10.1.2 查找不再使用的对象
10.1.3 垃圾回收算法
10.1.4 分代垃圾回收
10.1.5 Java垃圾回收器的历史
10.1.6 了解G1的原理
10.1.7 了解G1 Young GC
10.1.8 了解G1 Mixed GC
10.2 了解ZGC
10.2.1 更短的停顿
10.2.2 ZGC的着色指针和读屏障
10.2.3 读屏障
10.2.4 GC工作原理
10.3 了解Epsilon
10.4 了解Shenandoah
10.4.1 Shenandoah工作原理
10.4.2 性能指标
第11章 使用脚本语言
11.1 什么是JShell
11.2 为什么需要JShell
11.3 JShell的基本操作
11.3.1 启动JShell
11.3.2 退出JShell
11.3.3 使用JShell测试API
11.3.4 使用JShell操作流
11.3.5 获取帮助
11.4 实战:JShell的综合用法
11.4.1 定义方法
11.4.2 使用自定义的方法
11.4.3 查看所有的变量及引用情况
11.4.4 保存历史
11.4.5 打开文件
11.4.6 获取变量的引用值
第12章 lambda表达式及函数式编程
12.1 lambda表达式
12.1.1 第一个lambda表达式的例子
12.1.2 第二个lambda表达式的例子
12.1.3 lambda表达式简写的依据
12.2 方法引用
12.2.1 什么是方法引用
12.2.2 实战:方法引用的例子
12.3 构造函数引用
12.4 函数式接口
12.4.1 Predicate
12.4.2 Consumer
12.4.3 Function
12.4.4 总结
12.5 Consumer接口
12.5.1 andThen
12.5.2 IntConsumer
12.5.3 LongConsumer
12.5.4 DoubleConsumer
12.5.5 BiConsumer
12.6 Supplier接口
12.6.1 get
12.6.2 BooleanSupplier
12.6.3 IntSupplier
12.6.4 LongSupplier
12.6.5 DoubleSupplier
12.7 Predicate接口
12.7.1 test
12.7.2 negate
12.7.3 or
12.7.4 and
12.7.5 not
12.7.6 IntPredicate
12.7.7 BiPredicate
12.8 Function接口
12.8.1 compose
12.8.2 andThen
12.8.3 identity
12.9 类型检查
12.10 类型推导
12.11 使用本地变量
第13章 Stream
13.1 Stream API概述
13.1.1 什么是聚合操作
13.1.2 什么是Stream
13.1.3 Stream的构成
13.2 实例:Stream使用例子
13.2.1 传统的过滤数据的做法
13.2.2 Stream过滤数据的做法
13.3 Stream与集合的异同点
13.4 Stream常用操作
13.4.1 collect(toList())终止操作
13.4.2 map中间操作
13.4.3 filter中间操作
13.4.4 count终止操作
13.4.5 min终止操作
13.4.6 max终止操作
13.4.7 reduce终止操作
13.5 过滤数据
13.6 切分数据
13.6.1 使用Predicate切分数据
13.6.2 截断Stream
13.6.3 跳过元素
13.7 映射
13.7.1 map
13.7.2 flatMap
13.8 查找和匹配
13.8.1 allMatch
13.8.2 anyMatch
13.8.3 noneMatch
13.8.4 findFirst
13.8.5 findAny
13.9 压缩数据
13.9.1 计算总和
13.9.2 计算最大值和最小值
13.10 构造Stream
13.10.1 从值中构造
13.10.2 从nullable中构造
13.10.3 从数组中构造
13.10.4 从集合中构造
13.10.5 从文件中构造
13.11 收集收据
13.11.1 Collector接口
13.11.2 Collectors
13.11.3 统计总数
13.11.4 计算最大值和最小值
13.11.5 求和
13.11.6 求平均数
13.11.7 连接字符串
13.11.8 分组
13.11.9 分区
13.12 并行计算
13.12.1 并行流
13.12.2 stream与parallelStream的抉择
13.13 Spliterator接口
第14章 集合的增强
14.1 集合工厂
14.1.1 List工厂
14.1.2 Set工厂
14.1.3 Map工厂
14.2 实战:List工厂的使用
14.3 实战:Set工厂的使用
14.4 实战:Map工厂的使用
14.5 List和Set常用方法
14.5.1 removeIf
14.5.2 replaceAll
14.6 实战:removeIf方法的使用
14.7 实战:replaceAll方法的使用
14.8 Map常用方法
14.8.1 forEach
14.8.2 sorted
14.8.3 getOrDefault
14.9 实战:forEach方法的使用
14.10 实战:排序的使用
14.11 实战:getOrDefault的使用
14.12 实战:计算操作
14.12.1 computeIfAbsent
14.12.2 computeIfPresent
14.12.3 compute
14.13 实战:移除操作
14.14.1 replaceAll
14.14.2 replace
14.14 实战:替换操作
14.15 实战:合并操作
14.16 ConcurrentHashMap的改进
14.16.1 Java 8之前的ConcurrentHashMap类
14.16.2 Java 8之后的ConcurrentHashMap类的改进
第15章 新的日期和时间API
15.1 了解LocalDate
15.2 了解LocalTime
15.3 了解LocalDateTime
15.4 了解Instant
15.5 了解Duration
15.6 了解Period
15.7 常用日期的操作
15.8 调整时间
15.9 格式化日期
15.10 时区处理
15.11 日历
第16章 并发编程的增强
16.1 Stream的parallel()方法
16.2 执行器及线程池
16.2.1 线程及线程数
16.2.2 线程池
16.2.3 Java 8中的Executors增强
16.2.4 了解线程池的的风险
16.3 Future API
16.3.1 并行提交任务
16.3.2 顺序返回结果
16.4 CompletableFuture
16.4.1 CompletionStage
16.4.2 CompletableFuture
16.4.3 CompletableFuture类使用示例
16.5 异步API中的异常处理
16.6 box-and-channel模型
16.7 实例:在线商城
16.8 实例:同步方法转为异步
16.8.1 异常处理
16.8.2 使用supplyAsync简化代码
第17章 模块化(Jigsaw)
17.1 为什么需要模块化
17.1.1 体积大
17.1.2 访问控制粒度不够细
17.1.3 依赖地狱
17.2 用模块化开发和设计Java应用
17.2.1 模块的声明
17.2.2 模块的零件
17.2.3 模块描述
17.2.4 平台模块
第18章 响应式编程
18.1 响应式编程概述
18.1.1 Flow Control的几种方案
18.1.2 Pull、Push与Pull-Push
18.1.3 Flow API与Stream API
18.2 Flow API
18.2.1 订阅者Subscriber
18.2.2 Subscriber示例
18.2.3 发布者Publisher
18.2.4 订阅Subscription
18.2.5 处理器Processor
18.3 实战:响应式编程综合示例
18.3.1 定义Subscriber
18.3.2 定义Publisher
18.3.3 运行应用
参考文献
· · · · · · (
收起)