目 录 第一部分 Java编程概述 第1章 Java 12入门知识 3 1.1 如何安装和运行Java 3 1.1.1 何为JDK以及为何需要JDK 4 1.1.2 Java SE的安装 4 1.1.3 命令和实用工具 5 1.2 集成开发环境 6 1.2.1 选择一种IDE 6 1.2.2 安装和配置IntelliJ IDEA 7 1.2.3 创建项目 8 1.2.4 从命令行执行示例程序 13 1.3 Java基本类型和运算符 14 1.3.1 boolean(布尔)类型 14 1.3.2 数值类型 14 1.3.3 基本类型的默认值 17 1.3.4 基本类型的字面值 17 1.3.5 新增的压缩数字格式 19 1.3.6 运算符 19 1.4 String(字符串)类型和字面值 22 1.4.1 字符串字面值 23 1.4.2 字符串不变性 24 1.5 标识符和变量 25 1.5.1 标识符 25 1.5.2 变量声明(定义)与初始化 25 1.5.3 类型持有器var 26 1.6 Java语句 26 1.6.1 表达式语句 27 1.6.2 控制流语句 27 本章小结 35 第2章 Java面向对象编程 36 2.1 OOP概念 36 2.1.1 对象/类 37 2.1.2 继承 37 2.1.3 抽象/接口 38 2.1.4 封装 39 2.1.5 多态性 39 2.2 类 39 2.2.1 方法 40 2.2.2 可变参数方法 41 2.2.3 构造方法 42 2.2.4 new运算符 44 2.2.5 java.lang.Object类 45 2.2.6 实例属性和方法以及静态属性和方法 46 2.3 接口 48 2.3.1 默认方法 49 2.3.2 私有方法 50 2.3.3 静态字段和方法 50 2.3.4 接口与抽象类对比 50 2.4 重载、覆盖与隐藏 51 2.4.1 重载 51 2.4.2 覆盖 52 2.4.3 隐藏 54 2.5 final变量、final方法和final类 56 2.5.1 final变量 56 2.5.2 final方法 57 2.5.3 final类 57 2.6 多态性实战 58 2.6.1 对象工厂 58 2.6.2 instanceof运算符 60 本章小结 61 第3章 Java基础知识 62 3.1 包、导入和访问修饰符 62 3.1.1 包 63 3.1.2 导入 63 3.1.3 访问修饰符 64 3.2 Java引用类型 66 3.2.1 类与接口 67 3.2.2 数组 67 3.2.3 枚举 68 3.2.4 默认值与字面值 70 3.2.5 引用类型作为方法参数 70 3.2.6 equals()方法 72 3.3 保留和受限关键字 74 3.3.1 保留关键字 74 3.3.2 受限关键字 75 3.4 this和super两个关键字的用法 75 3.4.1 this关键字的用法 75 3.4.2 super关键字的用法 76 3.5 基本类型间的转换 77 3.5.1 加宽转换 77 3.5.2 缩窄转换 78 3.5.3 转换方法 78 3.6 基本类型和引用类型间的转换 80 3.6.1 装箱 80 3.6.2 拆箱 81 本章小结 82 第二部分 Java主要构建单元 第4章 异常处理 85 4.1 Java异常处理框架 85 4.2 受检型异常和非受检型异常 86 4.3 try块、catch块和finally块 88 4.4 throws语句 89 4.5 throw语句 90 4.6 assert语句 91 4.7 异常处理中最佳实践 92 本章小结 92 第5章 字符串、输入输出和文件 93 5.1 字符串处理 93 5.1.1 String类处理方法 93 5.1.2 String实用工具 97 5.2 I/O流 99 5.2.1 流数据 99 5.2.2 InputStream类及其子类 100 5.2.3 OutputStream类及其子类 107 5.2.4 Reader类和Writer类及其子类 109 5.2.5 java.io包中其他类 111 5.2.6 java.util.Scanner类 117 5.3 文件管理 119 5.3.1 创建和删除文件和目录 119 5.3.2 列出文件和目录 120 5.4 Apache的FileUtils和IOUtils实用工具 121 5.4.1 FileUtils类 122 5.4.2 IOUtils类 122 本章小结 123 第6章 数据结构、泛型和流行实用工具 124 6.1 List接口、Set接口和Map接口 124 6.1.1 泛型 125 6.1.2 如何对List和Set初始化 125 6.1.3 java.lang.Iterable接口 128 6.1.4 Collection接口 128 6.1.5 List接口 130 6.1.6 Set接口 131 6.1.7 Map接口 132 6.1.8 不可修改的集合 134 6.2 Collections实用工具 134 6.2.1 java.util.Collections类 134 6.2.2 org.apache.commons.collections4.CollectionUtils类 136 6.3 Arrays实用工具 137 6.3.1 java.util.Arrays类 137 6.3.2 org.apache.commons.lang3.ArrayUtils类 138 6.4 Objects实用工具 139 6.4.1 java.util.Objects类 139 6.4.2 org.apache.commons.long3.ObjectUtils类 142 6.5 java.time包 142 6.5.1 LocalDate类 142 6.5.2 LocalTime类 145 6.5.3 LocalDateTime类 145 6.5.4 Period类和Duration类 146 本章小结 147 第7章 Java标准库和外部库 148 7.1 Java类库 148 7.1.1 java.lang包 149 7.1.2 java.util包 150 7.1.3 java.time包 150 7.1.4 java.io包和java.nio包 151 7.1.5 java.sql包和javax.sql包 151 7.1.6 java.net包 151 7.1.7 java.lang.Math类和java.math包 151 7.1.8 java.awt包、javax.swing包和javafx包 151 7.2 Java外部库 152 7.2.1 org.junit包 152 7.2.2 org.mockito包 153 7.2.3 org.apache.log4j包和org.slf4j包 154 7.2.4 org.apache.commons包 156 本章小结 159 第8章 多线程和并发处理 160 8.1 线程与进程对比 160 8.2 用户线程与守护线程对比 160 8.3 Thread类的扩展 161 8.4 Runnable接口的实现 162 8.5 Thread类的扩展与Runnable接口的实现对比 163 8.6 线程池的使用 164 8.7 如何从线程获得结果 169 8.8 并行处理与并发处理对比 173 8.9 相同资源的并发修改 173 8.9.1 原子变量 176 8.9.2 同步方法 177 8.9.3 同步块 177 8.9.4 并发集合 178 8.9.5 内存一致性错误的处理 180 本章小结 180 第9章 JVM结构和垃圾收集 181 9.1 Java应用程序的执行 181 9.1.1 使用IDE 181 9.1.2 从命令行运行类 184 9.1.3 从命令行运行JAR文件 186 9.1.4 从命令行运行可执行的JAR文件 187 9.2 Java进程 187 9.2.1 类的加载 189 9.2.2 类的链接 190 9.2.3 类的初始化 190 9.2.4 类的实例化 190 9.2.5 方法执行 191 9.2.6 垃圾收集 191 9.2.7 应用程序终止 191 9.3 JVM结构 193 9.3.1 运行时数据区 193 9.3.2 类加载器 193 9.3.3 执行引擎 193 9.4 垃圾收集 194 9.4.1 响应时间、吞吐量和全局停顿 194 9.4.2 对象寿命和世代 194 9.4.3 全局停顿无法避免时 195 本章小结 195 第10章 数据库数据管理 196 10.1 创建数据库 196 10.2 创建数据库结构 197 10.3 连接到数据库 199 10.4 关闭连接 201 10.5 数据的CRUD操作 202 10.5.1 INSERT语句 202 10.5.2 SELECT语句 202 10.5.3 UPDATE语句 203 10.5.4 DELETE语句 204 10.5.5 使用Statement接口 204 10.5.6 使用PreparedStatement接口 208 10.5.7 使用CallableStatement接口 209 本章小结 210 第11章 网络编程 211 11.1 网络协议 211 11.2 基于UDP的通信 212 11.3 基于TCP的通信 215 11.3.1 java.net.ServerSocket类 216 11.3.2 java.net.Socket类 218 11.3.3 示例程序的运行 219 11.4 UDP与TCP对比 220 11.5 基于URL的通信 221 11.5.1 URL语法 221 11.5.2 java.net.URL类 222 11.6 使用HTTP 2客户端API 226 11.6.1 阻塞HTTP请求 227 11.6.2 非阻塞(异步)HTTP请求 229 11.6.3 服务器推送功能 233 11.6.4 WebSocket支持 234 本章小结 235 第12章 Java GUI编程 236 12.1 Java GUI技术 236 12.2 JavaFX基础知识 237 12.3 JavaFX简单编程示例 239 12.4 控件元素 241 12.5 图表 243 12.6 CSS的应用 244 12.7 FXML的使用 246 12.8 HTML的嵌入 250 12.9 媒体的播放 256 12.10 特效的添加 259 本章小结 266 第三部分 Java高级阶段 第13章 函数式编程 269 13.1 何为函数式编程 269 13.1.1 函数式接口 271 13.1.2 lambda表达式 272 13.1.3 lambda参数的局部变量语法 273 13.2 标准函数式接口 274 13.2.1 Consumer<T>接口 274 13.2.2 Predicate<T>接口 276 13.2.3 Supplier<T>接口 277 13.2.4 Function<T, R>接口 277 13.2.5 其他标准函数式接口 279 13.3 lambda表达式的限制 279 13.4 方法引用 280 本章小结 282 第14章 Java标准流 283 14.1 流——数据源和操作源 283 14.2 流的初始化 284 14.2.1 Stream接口 284 14.2.2 Stream.Builder接口 287 14.2.3 其他类和接口 288 14.3 操作(方法) 290 14.3.1 中间操作 290 14.3.2 终止操作 293 14.4 数值流接口 308 14.4.1 创建流 308 14.4.2 中间操作 308 14.4.3 终止操作 310 14.5 并行流 311 14.5.1 无状态操作和有状态操作 311 14.5.2 顺序处理还是并行处理 312 本章小结 312 第15章 反应式编程 313 15.1 异步处理 313 15.1.1 顺序流和并行流 313 15.1.2 CompletableFuture对象的使用 315 15.2 非阻塞API 316 15.2.1 java.io包与java.nio包对比 316 15.2.2 事件/运行循环 316 15.3 反应式体系 317 15.3.1 响应性 318 15.3.2 复原性 318 15.3.3 灵活性 318 15.3.4 消息驱动 318 15.4 反应式流 319 15.5 RxJava——Java反应式扩展 320 15.5.1 Observable对象的划分 321 15.5.2 Disposable对象 327 15.5.3 Observable对象的创建 328 15.5.4 操作符 330 15.5.5 多线程(调度器) 337 本章小结 341 第16章 微服务架构 342 16.1 何为微服务 342 16.2 微服务架构的规模 343 16.3 微服务架构如何相互交流 344 16.4 微服务架构的反应式系统 346 16.4.1 HTTP服务器 346 16.4.2 EventBus消息接收器 349 16.4.3 EventBus消息发送器 350 16.4.4 反应式系统演示 353 本章小结 354 第17章 Java微基准测试工具 355 17.1 何为JMH 355 17.2 JMH基准的创建 357 17.3 使用IDE插件运行基准 358 17.4 JMH基准参数 361 17.4.1 模式 361 17.4.2 输出时间单位 361 17.4.3 迭代 361 17.4.4 分叉 361 17.5 JMH使用示例 362 17.5.1 使用@State注解 363 17.5.2 使用Blackhole对象 364 17.5.3 使用@CompilerControl注解 364 17.5.4 使用@Param注解 365 17.6 告诫之语 365 本章小结 366 第18章 高质量代码编写最佳实践 367 18.1 Java行业惯用语、实现及用法 367 18.1.1 equals()方法和hashCode()方法 367 18.1.2 compareTo()方法 369 18.1.3 clone()方法 371 18.1.4 StringBuffer类和StringBuilder类 374 18.1.5 try子句、catch子句和finally子句 374 18.2 最佳设计实践 374 18.2.1 松耦合功能区的识别 374 18.2.2 功能区的传统层划分 374 18.2.3 接口代码的编写 375 18.2.4 工厂方法的使用 375 18.2.5 宁组合勿继承 375 18.2.6 库的使用 375 18.3 代码为人而写 375 18.4 测试——通向高质量代码的捷径 376 本章小结 377 第19章 Java的最新特征 378 19.1 Java仍在继续进化 378 19.2 Panama项目 379 19.3 Valhalla项目 379 19.4 Amber项目 380 19.4.1 数据类 380 19.4.2 模式匹配 381 19.4.3 原字符串字面值 382 19.4.4 简洁方法体 382 19.4.5 lambda遗留 383 19.5 Loom项目 384 19.6 Skara项目 385 本章小结 385 ?? ?? ?? VI Java 12程序设计学习指南 目录 VII