新書推薦:

《
付出就一定有收获吗?给孩子的聪明哲思绘本 全6册
》
售價:HK$
109.8

《
自主机器人导论
》
售價:HK$
87.8

《
何处为家:雪莉·哈扎德和唐纳德·基恩的书信情谊
》
售價:HK$
96.8

《
和虫虫面对面
》
售價:HK$
74.7

《
何谓明治(历史学堂)
》
售價:HK$
63.8

《
古典的别择(艺文志·古典)
》
售價:HK$
57.2

《
弱关联:在旅行中探寻检索词
》
售價:HK$
53.9

《
稷下先生(稷下学宫的历史探究,稷下先生的故事再现)
》
售價:HK$
74.8
|
編輯推薦: |
《Java学习笔记(第6版)》是作者十多年教学经验的总结,汇集了学员在学习过程中或认证考试中遇到的关于概念、实验、应用等方面的问题及解决方案。
本书基于Servlet?4.0/Java SE 15,对代码进行了重新审查与更新,涵盖Java 15~17的文本块、模式比对、record/sealed等新特性,并介绍OWASP TOP 10、CWE、CVE,讨论注入攻击、会话安全、密码管理、Java EE安全机制、CSRF等Web安全概念。必要时从Java SE API的源代码开始分析,介绍各种语法在Java SE API中的应用。本书还添加了关于Spring的内容,包含Spring DI/AOP、Spring MVC、Spring Security等,以及Spring Boot快速开发方案的使用,涵盖中文处理、图片验证、自动登录、验证过滤器、压缩处理、在线资料管理、邮件发送等领域的实用案例。此外,本书还提供丰富的练习示例,让你更好地掌握学习重点,并详细介绍IDE的使用,使你可以快速将所学知识应用于工作中。
本书适合 Java 的初、中级读者以及广大 Java 应用开发人员阅读。
|
內容簡介: |
·基于Servlet 4.0/Java SE 15,对代码进行了重新审阅与更新。
來源:香港大書城megBookStore,http://www.megbook.com.hk ·介绍OWASP TOP 10、CWE、CVE,讨论注入攻击、会话安全、密码管理、Java EE安全机制、CSRF等Web安全概念。
·增加关于Spring的内容,包含Spring DI/AOP、Spring MVC、Spring Security等,以及Spring Boot快速开发方案的使用。
·涵盖中文处理、图片验证、自动登录、验证过滤器、压缩处理、在线资料管理、邮件发送等领域的实用案例。
·综合练习示例贯穿全书,你可将所学技术应用于其中,并通过重构来改进应用程序架构。
·本书提供的实战示例可以让你更好地掌握学习重点。作为本书内容之一的IDE操作,使你可以在实际工作中快速上手。
|
關於作者: |
林信良(网名:良葛格),自由工作者,擅长技术写作、翻译与培训。喜欢研究编程语言、开发架构、社交媒体,从中学习设计思想、规范及文化,并利用闲暇时间记录所学。技术文章及书籍涵盖C/C 、Java、Python、JavaScript、Haskell、OpenSCAD等领域。目前出版的著作有《JSP & Servlet学习笔记》(第2版)、《Spring 2.0技术手册》《Java JDK 9学习笔记》等,译作有《Ajax实战手册》《jQuery实战手册》(第2版)等。
|
目錄:
|
第 1 章 Java平台概述 1
1.1 Java不只是语言 1
1.1.1 Java的前世今生 1
1.1.2 三大平台 5
1.1.3 JCP与JSR 7
1.1.4 Oracle JDK与OpenJDK 8
1.2 JVM/JRE/JDK 10
1.2.1 什么是JVM 10
1.2.2 JRE与JDK 12
1.2.3 下载并安装JDK 13
1.2.4 了解JDK安装内容 15
第 2 章 从JDK到IDE 17
2.1 从“Hello,World”开始 17
2.1.1 编写Java源代码 17
2.1.2 PATH是什么 20
2.1.3 JVM(java)与CLASSPATH 23
2.1.4 编译器(javac)与CLASSPATH 26
2.2 管理源代码和字节码文件 27
2.2.1 编译器(javac)与SOURCEPATH 28
2.2.2 通过package对类进行管理 29
2.2.3 使用import简化操作 31
2.3 初识模块平台系统 34
2.3.1 JVM(java)与module-path 34
2.3.2 编译器(javac)与module-path 37
2.3.3 编译器(javac)与module-source-path 38
2.4 使用IDE 39
2.4.1 IDE项目管理基础 39
2.4.2 使用了哪个JRE 43
2.4.3 类文件版本 45
第 3 章 基础语法 48
3.1 类型、变量和运算符 48
3.1.1 类型 48
3.1.2 变量 52
3.1.3 运算符 55
3.1.4 处理类型 62
3.2 流程控制 66
3.2.1 if...else条件表达式 66
3.2.2 switch条件表达式 69
3.2.3 for循环 72
3.2.4 while循环 74
3.2.5 break和continue 75
课后练习 77
第 4 章 认识对象 78
4.1 类与实例 78
4.1.1 定义类 78
4.1.2 使用标准类 82
4.1.3 对象赋值与相等性 85
4.2 基本类型包装器 87
4.2.1 包裹基本类型 87
4.2.2 自动装箱与拆箱 88
4.2.3 自动装箱与拆箱的内幕 89
4.3 数组对象 92
4.3.1 数组基础 92
4.3.2 操作数据对象 95
4.3.3 复制数组 101
4.4 字符串对象 105
4.4.1 字符串基础 105
4.4.2 字符串特性 108
4.4.3 文本块 112
4.4.4 源代码编码 114
4.4.5 Java与Unicode 117
4.5 查询Java API文档 120
课后练习 124
第 5 章 对象封装 126
5.1 什么是封装 126
5.1.1 封装对象初始流程 126
5.1.2 对象封装的操作流程 129
5.1.3 封装对象的内部数据 132
5.2 类的语法细节 135
5.2.1 public权限设定 135
5.2.2 关于构造函数 137
5.2.3 构造函数与方法重载 138
5.2.4 使用this 140
5.2.5 static类成员 144
5.2.6 变长参数 149
5.2.7 内部类 150
课后练习 152
第 6 章 继承与多态 154
6.1 什么是继承 154
6.1.1 继承共同行为与实现 154
6.1.2 多态与从属 158
6.1.3 重新定义实现 163
6.1.4 抽象方法、抽象类 166
6.2 继承语法细节 167
6.2.1 protected成员 167
6.2.2 覆盖的细节 169
6.2.3 再看构造函数 171
6.2.4 再看final关键字 173
6.2.5 java.lang.Object 174
6.2.6 关于垃圾收集 181
6.2.7 再看抽象类 184
课后练习 186
第 7 章 接口与多态 188
7.1 什么是接口 188
7.1.1 使用接口定义行为 188
7.1.2 行为的多态 193
7.1.3 解决需求变化 196
7.2 接口的语法细节 203
7.2.1 接口的默认设定 203
7.2.2 匿名内部类 207
7.2.3 使用enum列举常量 212
课后练习 214
第 8 章 异常处理 215
8.1 语法与继承架构 215
8.1.1 使用try、catch 215
8.1.2 异常继承架构 218
8.1.3 要抓还是要抛 223
8.1.4 贴心还是制造麻烦 225
8.1.5 了解堆栈跟踪 228
8.1.6 关于assert 232
8.2 异常与资源管理 235
8.2.1 使用finally 235
8.2.2 自动尝试关闭资源 237
8.2.3 java.lang.AutoCloseable接口 240
课后习题 243
第 9 章 Collection与Map 244
9.1 使用Collection收集对象 244
9.1.1 认识Collection架构 244
9.1.2 带有索引的List 246
9.1.3 内容不重复的Set 250
9.1.4 支持队列操作的Queue 255
9.1.5 使用泛型 258
9.1.6 Lambda表达式简介 263
9.1.7 Iterable与Iterator 265
9.1.8 Comparable与Comparator 268
9.2 键值对与Map 273
9.2.1 常用Map实现的类 274
9.2.2 遍历Map键值 278
9.3 不可变的Collection与Map 281
9.3.1 不可变特性简介 281
9.3.2 Collections的unmodifiableXXX()方法 282
9.3.3 List、Set、Map的of()方法 284
课后练习 287
第 10 章 输入/输出 288
10.1 InputStream与OutputStream 288
10.1.1 流设计概念 288
10.1.2 流继承架构 292
10.1.3 流处理包装器 295
10.2 字符处理类 300
10.2.1 Reader与Writer继承架构 300
10.2.2 字符处理装饰器 302
课后练习 304
第 11 章 线程与并行API 306
11.1 线程 306
11.1.1 线程简介 306
11.1.2 Thread与Runnable 309
11.1.3 线程生命周期 311
11.1.4 关于ThreadGroup 318
11.1.5 synchronized与volatile 321
11.1.6 等待与通知 333
11.2 并行API 338
11.2.1 Lock、ReadWriteLock与Condition 338
11.2.2 使用Executor 348
11.2.3 并行Collection简介 357
课后练习 361
第 12 章 Lambda 362
12.1 认识Lambda语法 362
12.1.1 Lambda语法概览 362
12.1.2 Lambda表达式与函数式接口 366
12.1.3 当Lambda遇上this与final时 368
12.1.4 方法与构造函数引用 370
12.1.5 接口默认方法 373
12.2 Functional与Stream API 377
12.2.1 使用Optional取代null 377
12.2.2 标准API的函数式接口 380
12.2.3 使用Stream进行管道操作 383
12.2.4 对Stream进行reduce与collect 386
12.2.5 关于flatMap()方法 392
12.2.6 与Stream相关的API 395
12.2.7 活用Optional与Stream 396
12.3 Lambda、并行化与异步处理 399
12.3.1 Stream与并行化 399
12.3.2 Arrays与并行化 403
12.3.3 通过CompletableFuture进行异步处理 404
课后练习 408
第 13 章 时间与日期 409
13.1 认识时间与日期 409
13.1.1 衡量时间 409
13.1.2 年历简介 411
13.1.3 认识时区 412
13.2 认识Date与Calendar 412
13.2.1 时间轴上瞬间的Date 413
13.2.2 处理时间与日期的Calendar 414
13.3 新时间与日期API 417
13.3.1 机器时间观点的API 417
13.3.2 人类时间观点的API 419
13.3.3 对时间的运算 422
13.3.4 年历系统设计 425
课后练习 426
第 14 章 NIO与NIO2 427
14.1 认识NIO 427
14.1.1 NIO概述 427
14.1.2 Channel架构与操作 428
14.1.3 Buffer架构与操作 429
14.2 NIO2文件系统 433
14.2.1 NIO2架构 433
14.2.2 操作路径 434
14.2.3 属性读取与设定 437
14.2.4 操作文件与文件夹 440
14.2.5 读取、访问文件夹 443
14.2.6 过滤、搜索文件 448
课后练习 451
第 15 章 通用API 452
15.1 日志 452
15.1.1 日志API简介 452
15.1.2 指定日志层级 454
15.1.3 使用Handler与Formatter 457
15.1.4 自定义Handler、Formatter与Filter 458
15.1.5 使用logging.properties 461
15.2 HTTP Client API 462
15.2.1 浅谈URI与HTTP 462
15.2.2 HTTP Client API入门 466
15.2.3 发送请求信息 469
15.3 正则表达式 473
15.3.1 正则表达式简介 473
15.3.2 quote()与quoteReplacement() 481
15.3.3 Pattern与Matcher 482
15.3.4 Unicode正则表达式 487
15.4 处理数字 490
15.4.1 使用BigInteger 490
15.4.2 使用BigDecimal 492
15.4.3 数字的格式化 495
15.5 再谈堆栈跟踪 496
15.5.1 获取StackTraceElement 496
15.5.2 Stack-Walking API 499
课后练习 504
第 16 章 整合数据库 505
16.1 JDBC入门 505
16.1.1 JDBC简介 505
16.1.2 连接数据库 512
16.1.3 使用Statement、ResultSet 519
16.1.4 使用PreparedStatement、CallableStatement 524
16.2 JDBC高级应用 528
16.2.1 使用DataSource取得连接 528
16.2.2 使用ResultSet查看、更新数据 532
16.2.3 批量更新 534
16.2.4 Blob与Clob 535
16.2.5 事务简介 536
16.2.6 metadata简介 545
课后练习 547
第 17 章 反射与类加载器 549
17.1 使用反射 549
17.1.1 Class与.class文件 549
17.1.2 使用Class.forName() 552
17.1.3 从Class创建对象 554
17.1.4 从Class获得信息 557
17.1.5 操作对象的方法与成员 560
17.1.6 动态代理 563
17.1.7 反射与模块 567
17.1.8 使用ServiceLoader 574
17.2 了解类加载器 577
17.2.1 类加载器层级 577
17.2.2 创建ClassLoader实例 579
课后练习 581
第 18 章 自定义泛型、列举与标注 582
18.1 自定义泛型 582
18.1.1 使用extends与 582
18.1.2 使用super与 588
18.2 自定义列举 591
18.2.1 成员的细节 591
18.2.2 构造函数、方法与接口 592
18.3 record与sealed 596
18.3.1 深入了解record类 596
18.3.2 sealed的类型层级 601
18.4 关于标注 604
18.4.1 常用标准标注 604
18.4.2 自定义标注类型 608
18.4.3 运行时读取标注信息 614
课后练习 617
第 19 章 深入了解模块化 619
19.1 使用模块 619
19.1.1 模块的种类 619
19.1.2 requires、exports与opens的细节说明 623
19.1.3 补丁模块 627
19.1.4 放宽模块封装与依赖 628
19.2 模块API 630
19.2.1 使用Module 630
19.2.2 使用ModuleDescriptor 632
19.2.3 浅谈ModuleLayer 633
19.3 打包模块 634
19.3.1 使用jar打包 635
19.3.2 使用JMOD进行打包 637
19.3.3 使用jlink建立运行时镜像 640
附录 如何使用本书项目 643
|
內容試閱:
|
序
图灵奖得主Dijkstra在2001年写信给得州大学预算委员会,希望大学的程序设计入门课程不要使用命令式的Java取代函数式的Haskell;2001年前后是Java 2的时代,而Java 1.3推出没多久,难怪Dijkstra会觉得Java看起来就像个商业噱头,完全可以想象他为何对此感到不安。
然而从Java 8开始,Java持续、稳健地添加、增强函数式的语法、API等元素,跟上了其他具有一级函数式特性语言的脚步,添加了一些高级流程抽象,甚至在Java 16~17版本中,开始添加模式比对、record、sealed类,这些特性其实对应的是函数式中更为基础的元素——“代数数据类型(Algebraic Data Type)”,这让开发者不仅能使用命令式的Java,还能便利地基于函数式规范来思考与实践。
我本身也是函数式规范的爱好者,就我而言,命令式与函数式就是不同的思考方式,只不过人很容易受第一次接触的东西影响,甚至养成习惯。初入程序设计领域的人若一开始时接受命令式的训练,日后就会习惯用命令式来解决问题;若一开始时接受函数式的训练,那么看到命令式的x=x 1时,往往也会难以接受。
这也是Dijkstra在信中谈到的,我们会被使用的工具所约束,而编程语言作为一种工具,对我们的影响更为深远,因为它们塑造的是思考习惯!
就现实而言,大部分开发者确实是从命令式的训练开始的,这在一定程度上是因为许多主流语言是命令式的,同时反映了许多问题需要使用命令式来解决;然而命令式与函数式各有其应用场景,现今Java添加了越来越多的函数式元素,其实也反映了当今应用程序想解决的问题日益需要使用函数式。
如前所述,命令式与函数式就是不同的思考方式。对开发者来说,其实可使用的思考方式越多,面对问题时可用的工具就越多,也就越有办法确定合适的方案。
当然,要学习,就需要付出成本,不过我更倾向于认为这是一种投资,开发者在可用的思考方式等方面投资越多,能解决的问题就越广、越深,个人积累也越深厚,姑且不要说什么提高自身价值或不可取代性,就根本而言,这是对自己所从事领域的尊重。
毕竟程序设计本身就是一项需要不断培养思考方式的工作,是个需要不断积累经验的领域,如果开发者吝于在学习上投资,懒得花时间去积累经验,这不就是在贬低自身从事的工作吗?那么当初又何必进入这个领域呢?
2022.04
前言
通过本书的前言,你可以更好地了解如何阅读和使用本书。
新旧版本的差异
介绍JDK 15~17的新特性,是本书改版的重点之一。4.4.3节介绍Java 15的文本块(Text Block),6.2.5节介绍instanceof时也谈到了Java 16的模式比对(Pattern Matching),9.1.3节与18.3.1节介绍Java 16的record类,18.3.2节讨论Java 17的sealed类。
本书改版的第二个重点是对一些过时或不再需要详细介绍的内容进行简化或删除,如旧版中第1章的JDK历史、第5章的传值调用、第11章的ForkJoinPool、第13章的Data与Calendar、第15章的国际化、第16章的RowSet等。
删除陈旧内容的另一个目的是为新特性的说明留出足够的篇幅。另外,15.2节添加了Java 11中新增的HTTP Client API的说明,11.1.5节添加了java.util.concurrent.atomic说明。
至于本书的内容,照惯例将全书内容重新审阅了一次,并在示例部分适当地使用新特性,例如使用文本块简化字符串模板,如果某个类实际上是不可变的数据类,那就使用record类。
从Java SE 12开始,为了获取程序员的反馈意见,Java中的一些新功能会以预览的形式进行发布;这些预览功能在未来可能会发生比较大的变化,因此本书不会对预览功能进行介绍。
从Java SE 17开始,LTS(Long Term Support,长时间支持版本)的发布周期缩短为两年一次,因此本书未来的版本也将基于LTS的版本。
字体
本书对正文和程序代码使用了不同的字体,以进行区分。
代码示例
你可以通过扫描本书封底的二维码下载本书所使用的示例代码。
本书的许多示例代码都使用了完整的代码实现,如以下代码示例。
ClassObject Guess.java
package cc.openhome;
import java.util.Scanner;
import static java.lang.System.out;
public class Guess {
public static void main(String[] args) {
var console = new Scanner(System.in);
var number = (int) (Math.random() * 10);
var guess = -1;
do {
out.print(”猜数字(0 ~ 9):”);
guess = console.nextInt();
} while(guess != number);
out.println(”猜中了...XD”);
}
}
示例代码上方的ClassObject表示可在本书配套代码库的samples文件夹中找到相应章节的文件夹,然后在其中找到ClassObject项目;而ClassObject右边的Guess.java则表示,可以在这个项目中找到Guess.java文件。如果程序代码中出现了数字标号和提示文字,那么在后面的正文部分会有对这些数字标号和提示文字的详细说明。
原则上,建议你尝试编写并运行每个示例程序,但如果时间有限,可以自行决定练习哪些示例。本书带有不少的练习,建议你自己完成,如果示例旁有图标,比如下面的代码:
Game1 SwordsMan.java
package cc.openhome;
public class SwordsMan extends Role {
public void fight() {
System.out.println(”挥剑攻击”);
}
}
该图标表示建议你动手操作,而且在本书配套代码库的labs文件夹中,有该练习项目的基础代码。打开该项目之后,补全其中缺失的程序代码即可。
如果看到如下程序代码,则应知它是一个完整的程序代码,而不是项目的一部分,它旨在展现如何编写完整的内容:
public class Hello {
public static void main(String[] args) {
System.out.println(”Hello!World!”);
}
}
如果看到以下代码,则应知它是代码片段,旨在强调编写程序代码时需要特别注意的部分:
var swordsMan = new SwordsMan();
...
out.printf(”剑客 (%s, %d, %d)%n”, swordsMan.getName(),
swordsMan.getLevel(), swordsMan.getBlood());
var magician = new Magician();
...
out.printf(”魔法师 (%s, %d, %d)%n”, magician.getName(),
magician.getLevel(), magician.getBlood());
有些简单的代码片段会适当地使用jshell示例(可参考图3-1)。如果看到提示文字以jshell>开头,那么应知这些内容是在jshell环境中执行的,如下所示:
jshell> System.out.printf(”example:%.2f%n”, 19.234);
example:19.23
对话框
本书中会出现以下形式的对话框:
针对课程中提到的概念提供一些额外的资源或思考方向。虽然你可以暂时忽略这些提示,但如果有时间的话,不妨针对这些提示多做些思考或讨论。
针对课程中提到的概念以对话框的方式强调必须注意的使用方式、陷阱或应该避免的问题。看到这个对话框时请仔细思考。
附录
示例文件包括本书中全部的示例,并提供Eclipse示例项目,附录则说明如何使用这些示例项目。
|
|