新書推薦:
《
万千教育学前·与幼儿一起解决问题:捕捉幼儿园一日生活中的教育契机
》
售價:HK$
47.0
《
史铁生:听风八百遍,才知是人间(2)
》
售價:HK$
55.8
《
量子网络的构建与应用
》
售價:HK$
109.8
《
拍电影的热知识:126部影片里的创作技巧(全彩插图版)
》
售價:HK$
109.8
《
大唐名城:长安风华冠天下
》
售價:HK$
87.4
《
情绪传染(当代西方社会心理学名著译丛)
》
售價:HK$
88.5
《
中国年画 1950-1990 THE NEW CHINA: NEW YEAR PICTURE 英文版
》
售價:HK$
236.0
《
革命与反革命:社会文化视野下的民国政治(近世中国丛书)
》
售價:HK$
93.2
|
編輯推薦: |
适读人群 :本书面向所有希望透彻理解编程的主要概念、实现原理和思维逻辑的读者,具体来说:初中级Java开发者:本书采用Java语言,侧重于剖析编程概念背后的实现原理和内在逻辑。
Java专家用心力作,力求透彻讲解每个知识点,逐步建立编程知识图谱
以Java语言为例,由基础概念入手,到背后实现原理与逻辑,再到应用实践,融会贯通
|
內容簡介: |
Java专家撰写,力求透彻讲解每个知识点,逐步建立编程知识图谱。本书以Java语言为例,由基础概念入手,到背后实现原理与逻辑,再到应用实践,融会贯通。全书共六大部分,其要点如下。
*部分(第1~2章)讲解计算机程序的基本执行流程与元素,以及数据背后的二进制表示,帮读者掌握编程的基本概念。
第二部分(第3~7章)讲解面向对象的编程原理与逻辑,涉及类、继承与多态、接口与抽象类、异常与常用基础类,让读者透彻了解Java的重要基础面向对象。
第三部分(第8~12章)介绍泛型与容器及其数据结构和算法,涵盖泛型、列表和队列、各种Map和Set、堆与优先级队列等。
第四部分(第13~14章)介绍文件处理。涵盖文件的基本概念、二进制文件和字节流、文本文件和字符流、文件和目录操作,以及文件处理的一些高级技术,包括常见文件类型的处理、随机读写文件、内存映射文件、标准序列化机制,以及Jackson序列化。
第五部分(第15~20章)介绍并发,包括线程的传统基础知识和Java并发包。传统基础知识包括线程的基本概念与基本的同步、协作和中断机制;Java并发包涵盖原子变量、显式锁、显式条件、并发容器、异步任务执行服务、同步和协作工具类。Java专家撰写,力求透彻讲解每个知识点,逐步建立编程知识图谱。本书以Java语言为例,由基础概念入手,到背后实现原理与逻辑,再到应用实践,融会贯通。全书共六大部分,其要点如下。
*部分(第1~2章)讲解计算机程序的基本执行流程与元素,以及数据背后的二进制表示,帮读者掌握编程的基本概念。
第二部分(第3~7章)讲解面向对象的编程原理与逻辑,涉及类、继承与多态、接口与抽象类、异常与常用基础类,让读者透彻了解Java的重要基础面向对象。
第三部分(第8~12章)介绍泛型与容器及其数据结构和算法,涵盖泛型、列表和队列、各种Map和Set、堆与优先级队列等。
第四部分(第13~14章)介绍文件处理。涵盖文件的基本概念、二进制文件和字节流、文本文件和字符流、文件和目录操作,以及文件处理的一些高级技术,包括常见文件类型的处理、随机读写文件、内存映射文件、标准序列化机制,以及Jackson序列化。
第五部分(第15~20章)介绍并发,包括线程的传统基础知识和Java并发包。传统基础知识包括线程的基本概念与基本的同步、协作和中断机制;Java并发包涵盖原子变量、显式锁、显式条件、并发容器、异步任务执行服务、同步和协作工具类。
第六部分(第21~26章)介绍动态和声明式编程编程思路、API与技巧,涵盖反射、注解、动态代理、类加载机制、正则表达式、Java 8引入的函数式编程等。
|
關於作者: |
马俊昌,邻家科技CTO和联合创始人。北京理工大学博士,曾就职于IBM,从事中间件、云计算架构和开发工作,在万普世纪负责移动广告平台大数据分析和算法优化工作。2014年联合创立邻家科技,主要产品到位APP是一个到家生活服务平台。十多年来,一直从事Java编程,积累了比较丰富的经验。平时喜欢读书,研究技术与创新,乐于分享编程心得,欢迎关注我的微信公众号老马说编程,和你一起探索编程本质。
|
目錄:
|
目录:
Contents 目录
读者评论
前言
第一部分 编程基础与二进制
第1章 编程基础2
1.1 数据类型和变量3
1.2 赋值4
1.2.1 基本类型4
1.2.2 数组类型6
1.3 基本运算8
1.3.1 算术运算8
1.3.2 比较运算10
1.3.3 逻辑运算10
1.3.4 小结11
1.4 条件执行11
1.4.1 语法和陷阱11
1.4.2 实现原理14
1.5 循环16
1.5.1 循环的4种形式16
1.5.2 循环控制19
1.5.3 实现原理20
1.5.4 小结20
1.6 函数的用法21
1.6.1 基本概念21
1.6.2 进一步理解函数23
1.6.3 小结27
1.7 函数调用的基本原理27
1.7.1 栈的概念27
1.7.2 函数执行的基本原理28
1.7.3 数组和对象的内存分配29
1.7.4 递归调用的原理30
1.7.5 小结31
第2章 理解数据背后的二进制33
2.1 整数的二进制表示与位运算33
2.1.1 正整数的二进制表示33
2.1.2 负整数的二进制表示34
2.1.3 十六进制35
2.1.4 位运算36
2.2 小数的二进制表示37
2.2.1 小数计算为什么会出错37
2.2.2 二进制表示38
2.3 字符的编码与乱码39
2.3.1 常见非Unicode编码39
2.3.2 Unicode编码42
2.3.3 编码转换44
2.3.4 乱码的原因45
2.3.5 从乱码中恢复46
2.4 char的真正含义49
第二部分 面向对象
第3章 类的基础52
3.1 类的基本概念52
3.1.1 函数容器52
3.1.2 自定义数据类型53
3.1.3 定义第一个类55
3.1.4 使用第一个类55
3.1.5 变量默认值57
3.1.6 private变量57
3.1.7 构造方法58
3.1.8 类和对象的生命周期60
3.1.9 小结61
3.2 类的组合61
3.2.1 String和Date61
3.2.2 图形类62
3.2.3 用类描述电商概念63
3.2.4 用类描述人之间的血缘关系65
3.2.5 目录和文件66
3.2.6 一些说明67
3.2.7 小结68
3.3 代码的组织机制68
3.3.1 包的概念68
3.3.2 jar包71
3.3.3 程序的编译与链接71
3.3.4 小结72
第4章 类的继承73
4.1 基本概念73
4.1.1 根父类Object74
4.1.2 方法重写74
4.1.3 图形类继承体系75
4.1.4 小结80
4.2 继承的细节80
4.2.1 构造方法81
4.2.2 重名与静态绑定82
4.2.3 重载和重写83
4.2.4 父子类型转换85
4.2.5 继承访问权限protected85
4.2.6 可见性重写86
4.2.7 防止继承final87
4.3 继承实现的基本原理88
4.3.1 示例88
4.3.2 类加载过程90
4.3.3 对象创建的过程91
4.3.4 方法调用的过程92
4.3.5 变量访问的过程93
4.4 为什么说继承是把双刃剑94
4.4.1 继承破坏封装94
4.4.2 封装是如何被破坏的94
4.4.3 继承没有反映is-a关系97
4.4.4 如何应对继承的双面性97
第5章 类的扩展100
5.1 接口的本质100
5.1.1 接口的概念101
5.1.2 定义接口101
5.1.3 实现接口102
5.1.4 使用接口103
5.1.5 接口的细节105
5.1.6 使用接口替代继承106
5.1.7 Java 8和Java 9对接口的增强106
5.1.8 小结108
5.2 抽象类108
5.2.1 抽象方法和抽象类108
5.2.2 为什么需要抽象类109
5.2.3 抽象类和接口109
5.2.4 小结110
5.3 内部类的本质111
5.3.1 静态内部类111
5.3.2 成员内部类113
5.3.3 方法内部类115
5.3.4 匿名内部类117
5.4 枚举的本质119
5.4.1 基础120
5.4.2 典型场景122
第6章 异常125
6.1 初识异常125
6.1.1 NullPointerException(空指针异常)125
6.1.2 NumberFormatException(数字格式异常)126
6.2 异常类128
6.2.1 Throwable128
6.2.2 异常类体系129
6.2.3 自定义异常130
6.3 异常处理131
6.3.1 catch匹配131
6.3.2 重新抛出异常131
6.3.3 finally132
6.3.4 try-with-resources133
6.3.5 throws134
6.3.6 对比受检和未受检异常135
6.4 如何使用异常135
6.4.1 异常应该且仅用于异常情况136
6.4.2 异常处理的目标136
6.4.3 异常处理的一般逻辑137
第7章 常用基础类138
7.1 包装类138
7.1.1 基本用法139
7.1.2 共同点140
7.1.3 剖析Integer与二进制算法144
7.1.4 剖析Character149
7.2 剖析String155
7.2.1 基本用法156
7.2.2 走进String内部157
7.2.3 编码转换157
7.2.4 不可变性158
7.2.5 常量字符串159
7.2.6 hashCode160
7.2.7 正则表达式161
7.3 剖析StringBuilder162
7.3.1 基本用法162
7.3.2 基本实现原理162
7.3.3 String的 和=运算符165
7.4 剖析Arrays166
7.4.1 用法166
7.4.2 多维数组171
7.4.3 实现原理172
7.4.4 小结174
7.5 剖析日期和时间174
7.5.1 基本概念174
7.5.2 日期和时间API175
7.5.3 局限性182
7.6 随机183
7.6.1 Math.random183
7.6.2 Random184
7.6.3 随机的基本原理185
7.6.4 随机密码187
7.6.5 洗牌189
7.6.6 带权重的随机选择189
7.6.7 抢红包算法191
7.6.8 北京购车摇号算法192
7.6.9 小结193
第三部分 泛型与容器
第8章 泛型196
8.1 基本概念和原理196
8.1.1 一个简单泛型类197
8.1.2 容器类199
8.1.3 泛型方法201
8.1.4 泛型接口202
8.1.5 类型参数的限定202
8.1.6 小结205
8.2 解析通配符205
8.2.1 更简洁的参数类型限定205
8.2.2 理解通配符206
8.2.3 超类型通配符208
8.2.4 通配符比较211
8.3 细节和局限性211
8.3.1 使用泛型类、方法和接口211
8.3.2 定义泛型类、方法和接口213
8.3.3 泛型与数组214
8.3.4 小结217
第9章 列表和队列218
9.1 剖析ArrayList218
9.1.1 基本用法218
9.1.2 基本原理219
9.1.3 迭代221
9.1.4 ArrayList实现的接口225
9.1.5 ArrayList的其他方法227
9.1.6 ArrayList特点分析229
9.1.7 小结229
9.2 剖析LinkedList229
9.2.1 用法230
9.2.2 实现原理232
9.2.3 LinkedList特点分析238
9.3 剖析ArrayDeque239
9.3.1 实现原理239
9.3.2 ArrayDeque特点分析244
第10章 Map和Set245
10.1 剖析HashMap245
10.1.1 Map接口245
10.1.2 HashMap247
10.1.3 实现原理247
10.1.4 小结256
10.2 剖析HashSet256
10.2.1 用法256
10.2.2 实现原理258
10.2.3 小结259
10.3 排序二叉树260
10.3.1 基本概念260
10.3.2 基本算法261
10.3.3 平衡的排序二叉树263
10.3.4 小结264
10.4 剖析TreeMap264
10.4.1 基本用法265
10.4.2 实现原理267
10.4.3 小结273
10.5 剖析TreeSet274
10.5.1 基本用法274
10.5.2 实现原理275
10.5.3 小结276
10.6 剖析LinkedHashMap276
10.6.1 基本用法276
10.6.2 实现原理279
10.6.3 LinkedHashSet282
10.6.4 小结282
10.7 剖析EnumMap283
10.7.1 基本用法283
10.7.2 实现原理285
10.7.3 小结287
10.8 剖析EnumSet287
10.8.1 基本用法287
10.8.2 应用场景288
10.8.3 实现原理291
10.8.4 小结294
第11章 堆与优先级队列295
11.1 堆的概念与算法296
11.1.1 基本概念296
11.1.2 堆的算法298
11.1.3 小结302
11.2 剖析PriorityQueue302
11.2.1 基本用法302
11.2.2 实现原理304
11.2.3 小结309
11.3 堆和PriorityQueue的应用309
11.3.1 求前K个最大的元素309
11.3.2 求中值311
11.3.3 小结314
第12章 通用容器类和总结315
12.1 抽象容器类315
12.1.1 AbstractCollection316
12.1.2 AbstractList319
12.1.3 AbstractSequentialList321
12.1.4 AbstractMap323
12.1.5 AbstractSet325
12.1.6 AbstractQueue325
12.1.7 小结326
12.2 Collections326
12.2.1 查找和替换327
12.2.2 排序和调整顺序329
12.2.3 添加和修改332
12.2.4 适配器333
12.2.5 装饰器338
12.2.6 小结342
12.3 容器类总结342
12.3.1 用法和特点342
12.3.2 数据结构和算法344
12.3.3 设计思维和模式344
第四部分 文件
第13章 文件基本技术348
13.1 文件概述348
13.1.1 基本概念和常识348
13.1.2 Java文件概述352
13.2 二进制文件和字节流355
13.2.1 InputStreamOutputStream355
13.2.2 FileInputStreamFile-OutputStream357
13.2.3 ByteArrayInputStreamByteArrayOutputStream359
13.2.4 DataInputStreamData-OutputStream361
13.2.5 BufferedInputStreamBufferedOutputStream363
13.2.6 实用方法364
13.2.7 小结365
13.3 文本文件和字符流365
13.3.1 基本概念366
13.3.2 ReaderWriter368
13.3.3 InputStreamReaderOutput-StreamWriter368
13.3.4 FileReaderFileWriter369
13.3.5 CharArrayReaderChar-ArrayWriter370
13.3.6 StringReaderStringWriter370
13.3.7 BufferedReaderBuffered-Writer371
13.3.8 PrintWriter372
13.3.9 Scanner374
13.3.10 标准流374
13.3.11 实用方法376
13.3.12 小结377
13.4 文件和目录操作378
13.4.1 构造方法378
13.4.2 文件元数据378
13.4.3 文件操作379
13.4.4 目录操作380
第14章 文件高级技术383
14.1 常见文件类型处理384
14.1.1 属性文件384
14.1.2 CSV文件385
14.1.3 Excel388
14.1.4 HTML389
14.1.5 压缩文件391
14.2 随机读写文件394
14.2.1 用法394
14.2.2 设计一个键值数据库BasicDB396
14.2.3 BasicDB的实现397
14.2.4 小结401
14.3 内存映射文件402
14.3.1 基本概念402
14.3.2 用法403
14.3.3 设计一个消息队列BasicQueue404
14.3.4 实现消息队列406
14.3.5 小结409
14.4 标准序列化机制409
14.4.1 基本用法409
14.4.2 复杂对象411
14.4.3 定制序列化411
14.4.4 序列化的基本原理413
14.4.5 版本问题414
14.4.6 序列化特点分析414
14.5 使用Jackson序列化为JSONXMLMessagePack415
14.5.1 基本概念415
14.5.2 基本用法415
14.5.3 容器对象418
14.5.4 复杂对象419
14.5.5 定制序列化420
14.5.6 Jackson对XML支持的局限性428
14.5.7 小结428
第五部分 并发
第15章 并发基础知识430
15.1 线程的基本概念430
15.1.1 创建线程430
15.1.2 线程的基本属性和方法432
15.1.3 共享内存及可能存在的问题435
15.1.4 线程的优点及成本438
15.2 理解synchronized439
15.2.1 用法和基本原理439
15.2.2 进一步理解synchronized443
15.2.3 同步容器及其注意事项445
15.3 线程的基本协作机制450
15.3.1 协作的场景450
15.3.2 waitnotify450
15.3.3 生产者消费者模式453
15.3.4 同时开始455
15.3.5 等待结束456
15.3.6 异步结果458
15.3.7 集合点461
15.3.8 小结462
15.4 线程的中断463
15.4.1 取消关闭的场景463
15.4.2 取消关闭的机制463
15.4.3 线程对中断的反应464
15.4.4 如何正确地取消关闭线程467
15.4.5 小结467
第16章 并发包的基石468
16.1 原子变量和CAS468
16.2 显式锁473
16.3 显式条件483
第17章 并发容器490
17.1 写时复制的List和Set490
17.2 ConcurrentHashMap493
17.3 基于跳表的Map和Set498
17.4 并发队列501
第18章 异步任务执行服务505
18.1 基本概念和原理505
18.2 线程池513
18.3 定时任务的那些陷阱518
第19章 同步和协作工具类527
19.1 读写锁ReentrantReadWrite-Lock527
19.2 信号量Semaphore529
19.3 倒计时门栓CountDownLatch531
19.4 循环栅栏CyclicBarrier533
19.5 理解ThreadLocal535
第20章 并发总结541
20.1 线程安全的机制541
20.2 线程的协作机制543
20.3 容器类544
20.4 任务执行服务546
第六部分 动态与函数式编程
第21章 反射550
21.1 Class类551
21.2 应用示例559
21.3 反射与泛型561
第22章 注解564
22.1 内置注解564
22.2 框架和库的注解566
22.3 创建注解568
22.4 查看注解信息570
22.5 注解的应用:定制序列化571
22.6 注解的应用:DI容器573
第23章 动态代理577
23.1 静态代理577
23.2 Java SDK动态代理579
23.3 cglib动态代理584
23.4 Java SDK代理与cglib代理比较585
23.5 动态代理的应用:AOP585
第24章 类加载机制592
24.1 类加载的基本机制和过程593
24.2 理解ClassLoader594
24.3 类加载的应用:可配置的策略597
24.4 自定义ClassLoader598
24.5 自定义ClassLoader的应用:热部署599
第25章 正则表达式603
25.1 语法603
25.2 Java API612
25.3 模板引擎618
25.4 剖析常见表达式619
第26章 函数式编程628
26.1 Lambda表达式628
26.2 函数式数据处理:基本用法637
26.3 函数式数据处理:强大方便的收集器647
26.4 组合式异步编程658
26.5 Java 8的日期和时间API668
|
內容試閱:
|
前言:
Preface 前言
为什么要写这本书
写一本关于编程的书,是我大概15年前就有的一个想法,当时,我体会到了编程中数据结构的美妙和神奇,有一种收获的喜悦和分享的冲动。这种收获是我反复阅读教程十几遍,花大量时间上机练习调试得到的,这是一个比较痛苦的过程。我想,如果把我学到的知识更为清晰易懂地表达出来,其他人不就可以掌握编程容易一些,并体会到那种喜悦了吗?不过,当时感觉自己学识太浅,要学习的东西太多,想一想也就算了。
触发我开始写作是在2016年年初,可汗学院的事迹震撼了我。可汗学院的创始人是萨尔曼可汗,他自己录制了3000多个短视频,主要教中小学生基础课。他为每门课程建立了知识地图,地图由知识点组成,知识点之间有依赖关系。每个知识点都有一个视频,每个视频10分钟左右,他的讲解清晰透彻,极受欢迎。比尔盖茨声称可汗是他最欣赏的老师,邀请其在TED发表演讲,同时投资可汗成立了非营利机构可汗学院,可汗也受到了来自谷歌等公司的投资。可以说,可汗以一己之力推动了全世界的教育。
我就想,我可不可以学习可汗,为计算机编程教育做一点事情?也就是说,为编程的核心知识建立知识地图,从最基础的概念开始,分解为知识点,一个知识点一个知识点地讲解,每一个知识点都力争清晰透彻,阐述知识点是什么、怎么用、有什么用途、实现原理是什么、思维逻辑是什么、与其他知识点有什么关系等。可汗的形式是视频,但我想先从文字总结开始。我希望表达的是编程的通用知识,但编程总要用一个具体语言,我想就用我最熟悉的Java吧。
过去十几年,Java一直是软件开发领域最主流的语言之一,在可以预见的未来,Java还将是最主流的语言之一。但关于Java编程的书比比皆是,也不乏经典之作,市场还需要一本关于Java编程的书吗?甚至,还需要编程的书吗?如果需要,需要什么样的书呢?
关于编程的需求,我想答案是肯定的。过去几十年,IT革命深刻地改变了人们的生活,但这次革命还远远没有停止,在可以预见的未来,人工智能等前沿技术必将进一步改变世界,而要掌握人工智能技术,必须先掌握基本编程技术。人工智能在我国已经上升为国家战略。2017年7月,国务院印发了《新一代人工智能发展规划》,其中提到实施全民智能教育项目,在中小学阶段设置人工智能相关课程,逐步推广编程教育,未来,可能大部分人都需要学习编程。
关于编程的书是很多,但对于非计算机专业学生而言,掌握编程依然是一件困难的事情。绝大部分教程以及培训班过于追求应用,读者学完之后虽然能照着例子写一些程序,但却懵懵懂懂,知其然而不知其所以然,无法灵活应用,当希望进一步深入学习时,发现大部分专业书籍晦涩难懂,难以找到通俗易懂的与学过的应用相结合的进阶原理类书籍。
即使计算机专业的学生,学习编程也不容易。学校开设了很多理论课程,但学习理论的时候往往感觉比较枯燥,比如二进制、编码、数据结构和算法、设计模式、操作系统中的线程和文件系统知识等。而学习具体编程语言的时候,又侧重学习的是语法和API。学习计算机理论的重要目的是为了更好地编程,但学生却难以在理论和编程之间建立密切的联系。
这样,我的想法基本就确定了,用Java语言写一本帮助理解编程到底是怎么回事的书,尽量用通俗易懂的方式循序渐进地介绍编程中的主要概念、语法和类库,不仅介绍用法和应用,还剖析背后的实现原理,以与基础理论相结合,同时包含一些实用经验和教训,并解释一些更为高层的框架和库的基本原理,以与实践应用相结合,在此过程中,融合编程的一些通用思维逻辑。
我有能力写好吗?我并不是编程大师,但我想,可汗也不是每个领域的大师,但他讲授了很多领域的知识,的确帮助了很多人。过去十几年我一直从事编程方面的工作,也在不断学习和思考,我想,只要用心写,至少会给一些人带来一点帮助吧。
于是,我在2016年3月创建了微信公众号老马说编程,开始发布系列文章计算机程序的思维逻辑。每一篇文章对我都是一个挑战,每一个知识点我都花大量时间用心思考,反复琢磨,力求表达清晰透彻,做到最好。写作是一个痛苦和快乐交织的过程,最痛苦的就是满脑子都是相关的内容,但就是不知道该怎么表达的时候,而最快乐的就是写完一篇文章的时候。令人欣慰的是,这些文章受到了大量读者的极高评价,他们的溢美之词、自发分享和红包赞赏进一步增强了我写作的信心和动力。到2017年7月底,共写了95篇文章,关于Java编程的基本内容也就写完了。
在写作过程中,很多读者反馈希望文章可以尽快整理成书,以便阅读。2016年9月,机械工业出版社的高婧雅女士联系到了我,商讨出版的可能,在她的鼎力帮助和出版社的大力支持下,就有了大家看到的这本书。
本书特色
本书致力于帮助读者真正理解Java编程。对于每个语言特性和API,不仅介绍其概念和用法,还分析了为什么要有这个概念,实现原理是什么,背后的思维逻辑是什么;对于类库,分析了大量源码,使读者不仅知其然,还知其所以然,以透彻理解相关知识点。
本书虽然是Java语言描述,但以更为通用的编程逻辑为主,融入了很多通用的编程相关知识,如二进制、编码、数据结构和算法、设计模式、操作系统、编程思维等,使读者不仅能够学习Java语言,还可以提升整体的编程和计算机水平。
本书不仅注重实现原理,而且重视实用性。本书介绍了很多实践中常用的技术,包含不少实际开发中积累的经验和教训,使读者可以少走一些弯路。在实际开发中,我们经常使用一些高层的系统程序、框架和库,以提升开发效率,本书也介绍了如何利用基本API开发一些系统程序和框架,比如键值数据库、消息队列、序列化框架、DI(依赖注入)容器、AOP(面向切面编程)框架、热部署、模板引擎等,讲解这些内容的目的不是为了重新发明轮子,而是为了帮助读者更好地理解和应用高层的系统程序与框架。
本书高度注重表述,尽力站在读者的角度,循序渐进、简洁透彻,从最基本的概念开始,一步步推导出更为高级的概念,在介绍每个知识点时,都会尽力先介绍用法、示例和应用,再分析实现原理和思维逻辑,并与其他知识点建立联系,以便读者能够容易地、全面透彻地理解相关知识。
本书侧重于Java编程的主要概念,绝大部分内容适用于Java 5以上的版本,但也包含了最近几年Java的主要更新,包括Java 8引入的重要更新Lambda表达式和函数化编程。
读者对象
本书面向所有希望进一步理解编程的主要概念、实现原理和思维逻辑的读者,具体来说有以下几种。
初中级Java开发者:本书采用Java语言,侧重于剖析编程概念背后的实现原理和内在逻辑,同时包含很多实际编程中的经验教训,所以,对于Java编程经历不多,对计算机原理不太了解、对Java的很多概念一知半解的开发人员,阅读本书的收获可能最大,通过本书可以快速提升Java编程水平。而零基础Java开发者,可跳过原理性内容阅读。
非Java语言的开发者:本书不假设读者有任何Java编程基础,系统、全面、细致地讲述了Java的语法和类库,给出了很多示例。另外,本书介绍了很多编程的通用概念、知识、数据结构、设计模式、算法、实现原理和思维逻辑。同时,全书的讨论都尽量站在一个通用的编程语言角度,而非Java语言特定的角度。通过阅读本书,读者可以快速学习和掌握Java,建立与其他语言之间的联系,提升整体编程思维和水平。
中高级Java开发者:经验丰富的Java开发者阅读本书的收获也会很大,可以通过本书对编程有更为系统、更为深刻的认识。
如何阅读本书
本书分为六大部分,共26章内容。
第一部分(第1~2章)介绍编程基础与二进制。第1章介绍编程的基础知识,包括数据类型、变量、赋值、基本运算、条件执行、循环和函数。第2章帮助读者理解数据背后的二进制,包括整数的二进制表示与位运算、小数计算为什么会出错、字符的编码与乱码。
第二部分(第3~7章)介绍面向对象。第3章介绍类的基础知识,包括类的基本概念、类的组合以及代码的基本组织机制。第4章介绍类的继承,包括继承的基本概念、细节、实现原理,分析为什么说继承是把双刃剑。第5章介绍类的一些扩展概念,包括接口、抽象类、内部类和枚举。第6章介绍异常。第7章剖析一些常用基础类,包括包装类、String、StringBuilder、Arrays、日期和时间、随机。
第三部分(第8~12章)介绍泛型与容器及其背后的数据结构和算法。第8章介绍泛型,包括其基本概念和原理、通配符,以及一些细节和局限性。第9章介绍列表和队列,剖析ArrayList、LinkedList以及ArrayDeque。第10章介绍各种Map和Set,剖析HashMap、HashSet、排序二叉树、TreeMap、TreeSet、LinkedHashMap、LinkedHashSet、EnumMap和EnumSet。第11章介绍堆与优先级队列,包括堆的概念和算法及其应用。第12章介绍一些抽象容器类,分析通用工具类Collections,最后对整个容器类体系从多个角度进行系统总结。
第四部分(第13~14章)介绍文件。第13章主要介绍文件的基本技术,包括文件的一些基本概念和常识、Java中处理文件的基本结构、二进制文件和字节流、文本文件和字符流,以及文件和目录操作。第14章介绍文件处理的一些高级技术,包括一些常见文件类型的处理、随机读写文件、内存映射文件、标准序列化机制,以及Jackson序列化。
第五部分(第15~20章)介绍并发。第15章介绍并发的传统基础知识,包括线程的基本概念、线程同步的基本机制synchronized、线程协作的基本机制waitnotify,以及线程的中断。第16章介绍并发包的基石,包括原子变量和CAS、显式锁与显式条件。第17章介绍并发容器,包括写时复制的List和Set、ConcurrentHashMap、基于跳表的Map和Set,以及各种并发队列。第18章介绍异步任务执行服务,包括基本概念和实现原理、主要的实现机制线程池,以及定时任务。第19章介绍一些专门的同步和协作工具类,包括读写锁、信号量、倒计时门栓、循环栅栏,以及ThreadLocal。第20章对整个并发部分从多个角度进行系统总结。
第六部分(第21~26章)介绍动态与函数式编程。第21章介绍反射,包括反射的用法和应用。第22章介绍注解,包括注解的使用、创建,以及两个应用:定制序列化和DI容器。第23章介绍动态代理的用法和原理,包括Java SDK动态代理和cglib动态代理以及一个应用:AOP。第24章介绍类加载机制,包括类加载的基本机制和过程,ClassLoader的用法和自定义,以及它们的应用:可配置的策略与热部署。第25章介绍正则表达式,包括语法、Java API、一个简单的应用(模板引擎),最后剖析一些常见表达式。第26章介绍Java 8引入的函数式编程,包括Lambda表达式、函数式数据处理、组合式异步编程,以及Java 8的日期和时间API。
对于有一定经验的读者,可以挑选感兴趣的章节直接阅读。而对于初学者,建议从头阅读,但对于一些比较深入的原理性内容,以及一些比较高级的内容,如果理解比较困难可以跳过,有一定实践经验后再回头阅读。任何读者都可以将本书作为一本案头参考书,以备随时查阅不确定的概念、用法和原理。
勘误和支持
由于笔者的水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。如果读者有更多的宝贵意见,欢迎关注我的微信公众号老马说编程,可在后台留言,在关于部分也有最新的微信和QQ群信息,欢迎加入讨论,我会尽量提供满意的解答。同时,读者也可以通过邮箱swiftma@sina.com联系到我。期待得到你们的真挚反馈,在技术之路上互勉共进。
致谢
感谢我的微信公众号老马说编程、掘金、开发者头条和博客园技术社区的广大读者,他们的极高评价、自发分享和红包赞赏让我备受鼓舞,更重要的是,他们指出了很多文章中的错误,使我可以及时修正。
感谢掘金和开发者头条技术社区,他们经常推荐我的文章,使更多人可以看到。
感谢我在北京理工大学学习时的老师和同学们,在老师的教导和同学们的探讨中,我掌握了比较扎实的计算机基础,特别是我的已故恩师古志民教授,古教授指导我完成了本科到博士的学业,他严谨认真的学术态度深深地影响了我。
感谢我工作以来的领导和同事们,由于他们的言传身教,我得以不断提高自己的技术水平。
感谢机械工业出版社的编辑高婧雅,在一年多的时间中始终支持我的写作,她的帮助和建议引导我顺利完成全部书稿。
特别致谢
特别感谢我的爱人吴特和儿子久久,我为写作这本书,牺牲了很多陪伴他们的时间,但也正因为有了他们的付出与支持,我才能坚持写下去。
特别感谢我岳父母,特别是我的岳母,不遗余力地帮助我们照顾儿子,有了他们的帮助和支持,我才有时间和精力去完成写作工作。
特别感谢我的父母,他们在困难的生活条件下,付出了巨大的汗水与心血,将我养育成人,使我能够完成博士学业,他们一生勤劳朴素的品质深深地影响了我。
特别感谢我的兄长马俊杰,他一直是我成长路上的指明灯,也是从他的耐心讲解中我第一次了解到了计算机的基本工作机制。
谨以此书献给我最亲爱的家人,以及众多热爱编程技术的朋友们!
马俊昌
|
|