具体描述
内容简介:
本书主要基于Java 13来介绍Java核心编程相关的知识点,以及从Java 8至Java 13以来的新特性,主要内容包括:Java语言基础、面向对象编程、集合框架、异常处理、I/O处理、网络编程、并发编程、基本编程结构的改进、垃圾回收器的增强、使用脚本语言、Lambda表达式与函数式编程、Stream、集合的增强、新的日期和时间API、并发编程的增强、模块化、响应式编程等内容。通过本书的学习,读者不仅能够掌握Java语言的编程技巧,还可以拓展视野,提升市场竞争能力。本书主要面向Java语言的爱好者、Java工程师和架构师。
写作背景:
随着互联网应用的发展,各种编程语言层出不穷,比如C#、Golang、TypeScript、ActionScript等,但不管是哪种语言,都无法撼动Java的“霸主”地位。Java语言始终占据着各类编程语言排行榜的榜首,开发者对于Java的热情也是与日俱增。Java已然成为企业级应用和Cloud Native应用的首选语言。
那么为什么Java一直能保持这么火爆呢?究其原因,Java能够长盛不衰的最大秘诀就是能够与时俱进、不断推陈出新。
笔者从事Java开发已经有十几年了,可以说是Java技术发展的见证者和实践者。为了推广Java技术,笔者撰写了包括《分布式系统常用技术及案例分析》《Spring Boot 企业级应用开发实战》《Spring Cloud 微服务架构开发实战》《Spring 5开发大全》《Cloud Native 分布式架构原理与实践》等几十本Java领域的专著和开源书,期望以微薄之力对Java语言有所贡献。由于目前企业所使用的Java大多是Java 8之前的版本,市面上也缺乏Java 13的学习资料,因此笔者才撰写本书以补空白。
让我们一起踏上Java学习之旅吧!
本书重要主题:
构建Java开发环境
Java语言基础
面向对象编程
集合框架
异常处理
I/O处理
网络编程
并发编程
基本编程结构的改进
垃圾回收器的增强
使用脚本语言
Lambda表达式与函数式编程
Stream
集合的增强
新的日期和时间API
并发编程的增强
模块化
响应式编程
作者简介
柳伟卫,网名老卫、waylau,在 IT 公司担任项目经理、架构师、高级技术顾问等职位,是 CSDN、 开源中国、云栖社区等技术社区专家,慕课网特邀讲师。
具有多年软件开发管理及系统架构经验,在实际工作中,积累了大量系统架构、大数据处理以及性能调优经验。
业余时间创建了 waylau.com 网站,用于分享个人技术心得。喜欢开源,长期跃于各大开源社区。已经出版了包括《分布式系统常用技术及案例分析》《Spring Boot 企业级应用开发实战》《Spring Cloud 微服务架构开发实战》《Spring 5 开发大全》《Cloud Native 分布式架构原理与实践》《Angular企业级应用开发实战》《大型互联网应用轻量级架构实战》《Java核心编程》《Node.js企业级应用开发实战》在内的多本专著(https://waylau.com/books/)。
目录信息
前言
第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 运行应用
参考文献
· · · · · · (收起)
读后感
用户评价
我一直对数据库的底层实现非常好奇,于是买了《高性能MySQL》。这本书给我的感觉就是“务实”到了极致。它没有过多谈论理论模型,而是直接深入到MySQL的存储引擎(主要是InnoDB)的内部运作机制。作者似乎非常了解DBA(数据库管理员)在日常维护中会遇到的各种棘手问题,所以书中对索引的B+树结构、事务的ACID保证、锁的粒度和并发控制机制都有非常细致的讲解。最实用的部分在于如何通过慢查询日志分析、执行计划解读来优化SQL语句。我曾经有一个困扰很久的JOIN查询性能瓶颈,通过书中介绍的索引合并和查询重写技巧,最终找到了症结所在,性能提升了近十倍。这本书的结构安排也非常合理,从基础架构到高级调优,层层递进,让读者能循序渐进地掌握性能优化的各项技能。读完后,我对如何设计更合理的表结构和如何编写高效的查询语句有了全新的认识。
《算法导论》这本书简直是CS领域的“圣经”级别存在,我身边不少人买了之后束之高阁,因为它实在太难啃了。我个人采取的策略是,把它当作工具书和深度参考手册来用,而不是试图一口气读完。每次遇到特定算法问题,比如图论中的最短路径算法,我都会翻到对应的章节,那里的数学证明和复杂度分析做得极其严谨和透彻,告诉你为什么Dijkstra算法比Bellman-Ford更适合某些场景。这本书的叙述风格非常学术化,公式推导严密,让你无法产生任何“偷懒”的想法,必须跟着作者的逻辑链条一步步走。对于我这种更偏向应用开发的程序员来说,理解像快速傅里叶变换(FFT)这类高级算法的数学基础确实颇具挑战,但我明白,要真正突破瓶颈,这些理论深度是绕不开的。它让我对“效率”的理解不再停留在“代码跑得快”,而是上升到了数学和逻辑的层面。
我最近在研究前端的性能优化,结果朋友推荐了这本《高性能网站建设指南》。说实话,拿到书的时候,我对它能有多大帮助持怀疑态度,毕竟前端技术日新月异,一本纸质书能跟得上吗?事实证明,我错了。这本书的侧重点在于那些跨越技术周期的基础原则,比如HTTP协议的深层优化、浏览器渲染流水线的解析、资源加载的瀑布流管理,这些核心原理是不会过时的。它详细分析了减少请求数、优化文件大小、利用缓存等策略的实际操作方法,配有大量的代码片段和配置示例,非常具有实操性。特别是它对“请求阻塞”和“延迟加载”的处理,让我意识到之前为了追求“全屏展示”而牺牲了首屏加载速度的错误做法。虽然书里有些网络协议和服务器配置的介绍略显陈旧,但对于前端工程师来说,掌握如何与浏览器和网络层“友好协作”,这本书提供的视角是无价的。
说实话,我是在一位资深架构师的强烈推荐下才购入这本《设计模式:可复用面向对象软件的基础》的。这本书的份量放在书架上就让人感到沉甸甸的,但内容更是重量级。它不像市面上很多速成指南,上来就罗列二十几个模式,然后强行让你套用。GoF的原著更像是一本武林秘籍,它深入探讨了“为什么”需要这些模式,它们解决的是什么深层次的耦合问题,以及在何种情境下使用最能发挥威力。我特别欣赏它对UML图的运用,那些类图和交互图精准地描绘了模式内部的结构关系,比起纯文本描述,直观了太多。在实际工作中,当我遇到“如何让一个对象在不修改自身代码的情况下,增加新的行为”这种困惑时,翻开“策略模式”或“装饰者模式”的章节,立刻就能找到清晰的、经过时间检验的解决方案。这本书需要静下心来慢慢品味,它不是让你快速学会,而是让你学会“像大师一样思考设计问题”。读完后,我写代码时会下意识地去寻找更优雅的解耦方式,这才是真正的成长。
这本《深入理解计算机系统》真是本宝藏!我花了快两个月的时间,才勉强啃完第一遍。作者的叙述方式非常扎实,不是那种轻描淡写、只讲表面的教材。它真正做到了“深入”,从最底层的硬件架构,到操作系统内核的工作原理,再到程序编译链接的全过程,都有详尽的剖析。尤其让我印象深刻的是它对内存层次结构和虚拟内存的讲解,清晰地展示了为什么程序在不同内存区域的访问速度会有天壤之别。读完后,我对程序的执行流程有了脱胎换骨的认识,不再是那个只知道敲代码的“码农”了,而是开始理解代码如何在硅片上真正跑起来的“工程师”。书中穿插的大量实例和图表,极大地帮助了理解那些晦涩难懂的理论概念,比如缓存一致性协议的复杂性,在书中被分解得井井有条。唯一的遗憾可能就是,这本书的知识密度实在太大了,初次阅读时,很多地方需要反复对照后面的章节才能理清脉络,对读者的基础知识储备要求还是比较高的,但作为一本进阶参考书,它的价值无可替代。
Java领域最新力作!完全学习Java核心技术。
Java领域最新力作!完全学习Java核心技术。
想学Java,这本书应该是一个非常好的教程。不管是0基础,还是有一定经验的开发者,都应该学习这本书,而且这本书是基于最新的Java 13的哦~
Java最新的技术介绍。从Java 8到Java 13,所有特性一网打尽!
Java领域最新力作!完全学习Java核心技术。