Java无难事 详解Java编程核心思想与技术(第2版)
作 者:孙鑫 著
定 价:168
出 版 社:电子工业出版社
出版日期:2023年01月01日
页 数:844
装 帧:平装
ISBN:9787121445545
"快速入门
按照国内思维习惯和学习规律,循序渐进、手把手地教你快速掌握Java开发技术。内容由浅入深,知识讲解深入浅出,助读者轻松愉快地掌握Java知识。
示例丰富
理论若脱离实践则毫无意义,本书在讲解的同时给出数百个示例,以示例验证理论,边学边做,让学习更简单,更高效。
知其然且知其所以然
秉承作者一贯的写作风格,本书对知识的讲解不会出现含糊不清、一遇重难点即跳过的情形。不让你脑海里有疑问,为你扫清Java学习路途中的绊脚石。
涵盖从Java 5到Java 11的新特性
基于Java长期支持版本,Java常用特性贯穿全书。考虑到读者在工作中使用的Java版本不一定由自己决定,本书尽可能地对知识点来自Java哪个版本的新增特性给出了说明。
本书特色:
买书赠送超详细视频讲解!
你是否想知道依赖注入容器(IoC/DI)的实现原理?
你是否想知道面向切面编程(AOnull
《Java无难事》让你学习Java再无难事!本书系统地讲解了Java开发人员需要掌握的核心知识,按照中国人的思维习惯,由浅入深、循序渐进、引导式地带领你快速掌握Java知识。全书秉承作者一贯的写作风格,对知识的讲解让你知其然且知其所以然。全书语言通俗易懂、幽默风趣,在内容安排上由浅入深,在知识讲解上深入浅出,为你节省脑细胞,让你轻松愉快地掌握Java知识。看书累了,没关系,还有视频。同步学习视频并不是书中内容的重复,而是有力的补充和完善。本书还讲解了依赖注入(IoCDD)容器、面向切面编程(AOP)、对象关系映射(ORM)框架的实现原理,同时还给出了并发编程领域中经常用到的线程池的实现。本书涵盖了从Java5到Java11的所有重要新特性,不仅适合初学Java编程的读者,也适合有一定经验的读者,甚至对于正在从事Java开发工作的读者也适用。
孙鑫,IT技术和教育专家,2009年中国教育杰出人物。具有20多年的软件开发和教育培训经验,精通多种程序语言和技术架构。曾出版多本畅销技术专著,包括《Java Web开发详解》 《VC++深入详解》《Struts 2深入详解》《Servlet/JSP深入详解》《详解Spring Boot : 从入门到企业级开发实战》等。
无
第1章Java初窥1
1.1Java的起源1
1.2Java能做什么1
1.3相关概念2
1.3.1JDK2
1.3.2Java家族的三个成员2
1.3.3Java1、Java2和Java53
1.3.4JRE3
1.4安装JDK3
1.4.1下载JDK11(JavaSE11)4
1.4.2安装JDK5
1.4.3下载帮助文档6
1.5Java的特性6
1.5.1简单6
1.5.2面向对象7
1.5.3健壮7
1.5.4安全7
1.5.5结构中立7
1.5.6可移植7
1.5.7高性能8
1.5.8解释执行8
1.5.9平台无关8
1.5.10多线程8
1.5.11动态9
1.6Java跨平台的原理9
1.6.1Java源文件的编译过程9
1.6.2Java解释器运行机制9
1.6.3Java字节码的执行方式10
1.6.4理解JVM10
1.7第一个程序11
1.7.1了解JDK11
1.7.2编写第一个Java程序11
1.8扫清Java征途中的两块绊脚石15
1.8.1有用的PATH15
1.8.2难缠的CLASSPATH17
1.9交互式编程环境JShell19
1.10为Java程序打包20
1.10.1JAR文件20
1.10.2将字节码文件打包到
JAR包中20
1.10.3将目录中所有文件打包到
JAR文件中21
1.10.4清单文件21
1.11总结22
1.12实战练习22
第2章初识Java语言23
2.1标识符23
2.2数据类型23
2.2.1整数类型24
2.2.2浮点类型25
2.2.3字符(char)型25
2.2.4布尔(boolean)型26
2.2.5String类型26
2.3变量和字面常量26
2.3.1变量26
2.3.2字面常量27
2.4类型转换的奥秘30
2.5运算符32
2.5.1赋值运算符32
2.5.2自增和自减运算符32
2.5.3算术运算符33
2.5.4关系运算符34
2.5.5布尔运算符34
2.5.6位运算符35
2.5.7移位运算符37
2.5.8一元和二元运算符39
2.5.9三元运算符39
2.5.10优先级39
2.6表达式与语句40
2.7程序结构40
2.7.1分支语句41
2.7.2循环语句46
2.8数组54
2.8.1数组类型与声明数组54
2.8.2创建数组55
2.8.3使用数组56
2.8.4匿名数组57
2.8.5多维数组57
2.8.6数组的初始值和越界59
2.9分隔符60
2.10注释60
2.10.1传统注释60
2.10.2JavaDoc注释61
2.11Java中的关键字63
2.12总结63
2.13实战练习63
第3章进入对象的世界65
3.1面向对象思想65
3.2对象的状态和行为66
3.2.1对象都有一组固定的行为66
3.2.2注意思维习惯66
3.3面向对象编程的难点67
3.4Java的类与对象67
3.5字段(field)与方法68
3.5.1字段68
3.5.2方法68
3.5.3方法的参数与返回值69
3.6构造方法与new关键字71
3.7方法重载74
3.8特殊变量this75
3.9关键字static79
3.9.1静态字段79
3.9.2静态方法81
3.9.3static语句块82
3.10常量82
3.11枚举(enum)83
3.11.1原始的枚举实现83
3.11.2枚举类型84
3.11.3枚举值的比较86
3.11.4自定义枚举值86
3.12总结87
3.13实战练习87
第4章高级面向对象编程88
4.1继承88
4.2方法的覆盖(override)90
4.3多态(polymorphism)91
4.3.1何为多态91
4.3.2多态的实际应用92
4.3.3Java编译器如何实现多态94
4.3.4类型转换94
4.3.5协变返回类型96
4.3.6在构造方法中调用被覆盖的
方法97
4.4特殊变量super98
4.4.1访问父类被子类覆盖的方法或
隐藏的变量98
4.4.2调用父类构造方法100
4.5封装与private103
4.6对外发布的接口――public107
4.7再谈final109
4.7.1final类109
4.7.2final方法109
4.7.3final参数110
4.8对象的销毁110
4.9面向对象的四个基本特性111
4.10总结112
4.11实战练习112
第5章包和访问控制114
5.1在包中的类114
5.2导入类117
5.3静态导入119
5.4静态导入枚举类型120
5.5访问控制121
5.5.1类的访问说明符121
5.5.2类成员的访问说明符122
5.6总结126
5.7实战练习126
第6章抽象类与接口127
6.1抽象方法和抽象类127
6.2接口131
6.3接口中的数据成员133
6.4接口的继承与实现133
6.5接口的应用135
6.6深入接口――通信双方的协议137
6.7接口的默认方法和静态方法139
6.7.1默认方法139
6.7.2静态方法144
6.8接口的私有方法145
6.9总结146
6.10实战练习147
第7章内部类(InnerClass)149
7.1创建内部类149
7.2访问外部类150
7.3内部类与接口153
7.4局部内部类155
7.5匿名内部类157
7.5.1创建匿名内部类157
7.5.2匿名内部类的构造方法159
7.6静态内部类160
7.7内部类的继承与覆盖161
7.7.1内部类的继承161
7.7.2内部类的覆盖162
7.8内部类规则总结163
7.9回调与事件机制163
7.9.1回调(callback)163
7.9.2事件(event)167
7.10总结169
7.11实战练习169
第8章异常处理170
8.1什么是异常170
8.2捕获异常172
8.3使用finally进行清理175
8.4抛出异常与声明异常179
8.5RuntimeException182
8.6创建自己的异常体系结构184
8.7try-with-resources188
8.7.1自动关闭资源188
8.7.2声明多个资源189
8.7.3catch多个异常191
8.7.4使用更具包容性的类型
检查重新抛出异常192
8.8总结193
8.9实战练习193
第9章深入字符串194
9.1String类194
9.2==运算符与equals方法194
9.3compareTo方法197
9.4字符串拼接198
9.5操作字符串198
9.5.1获取字符串的长度199
9.5.2查找字符或字符串199
9.5.3判断字符串的开始与结尾200
9.5.4获取指定索引位置的字符200
9.5.5截取子字符串201
9.5.6分割字符串201
9.5.7替换字符或字符串202
9.5.8合并字符串203
9.5.9重复字符串203
9.5.10大小写转换203
9.5.11去除字符串首尾空白204
9.5.12判断字符串是否为空204
9.5.13提取字符串的行流205
9.5.14与字节数组相互转换205
9.6StringBuffer类和
StringBuilder类206
9.7格式化输出207
9.7.1格式说明符208
9.7.2参数索引208
9.7.3格式说明字符208
9.7.4宽度和精度209
9.7.5标志字符210
9.7.6生成格式化的String对象211
9.8正则表达式211
9.8.1正则表达式的优点211
9.8.2一切从模式开始213
9.8.3创建正则表达式213
9.8.4量词216
9.8.5String类的正则表达式方法216
9.8.6Pattern和Matcher218
9.8.7邮件地址验证218
9.8.8获取组匹配的内容220
9.8.9替换字符串221
9.9总结221
9.10实战练习222
第10章Java应用223
10.1再论引用类型223
10.1.1引用类型――数组223
10.1.2方法传参225
10.2操作数组226
10.2.1数组的复制226
10.2.2数组的排序229
10.2.3搜索数组中的元素232
10.2.4填充数组233
10.3基本数据类型与封装类234
10.3.1基本数据类型与封装类
对象的互相转换235
10.3.2封装类对象与字符串的
互相转换236
10.3.3基本数据类型与字符串的
互相转换236
10.3.4自动装箱与拆箱236
10.4对象的克隆237
10.5国际化与本地化242
10.5.1Locale242
10.5.2资源包244
10.5.3消息格式化248
10.6总结249
10.7实战练习249
第11章泛型250
11.1为什么需要泛型250
11.2泛型与基本数据类型253
11.3泛型类中的数组254
11.4元组256
11.5泛型接口258
11.5.1一个简单的泛型接口258
11.5.2匿名内部类实现泛型接口259
11.5.3map机制的实现260
11.6泛型方法262
11.6.1简单的泛型方法262
11.6.2完善映射机制的实现263
11.7通配符类型264
11.7.1通配符的子类型限定266
11.7.2通配符的超类型限定267
11.8类型参数的限定269
11.9深入泛型机制270
11.10泛型的一些问题272
11.10.1接口的二次实现272
11.10.2方法重载273
11.10.3泛型类型的实例化273
11.10.4异常274
11.11使用泛型的275
11.12类型参数的命名约定275
11.13总结275
11.14实战练习276
第12章Lambda表达式277
12.1理解Lambda表达式277
12.2Lambda表达式的语法278
12.3函数式接口279
12.4内置函数式接口280
12.5方法引用281
12.6构造方法引用282
12.7数组引用284
12.8总结284
12.9实战练习284
第13章集合类285
13.1集合框架中的接口与实现类285
13.1.1集合框架中的接口286
13.1.2集合框架中的实现类286
13.1.3Collection类型的集合286
13.1.4Map类型的集合288
13.2迭代289
13.2.1Iterator接口289
13.2.2迭代器与“foreach”循环291
13.2.3新增的forEach方法292
13.2.4ListIterator接口293
13.2.5迭代与回调295
13.3数据结构简介296
13.3.1链表296
13.3.2栈299
13.3.3队列299
13.4List299
13.4.1ArrayList300
13.4.2LinkedList303
13.4.3List集合类的性能306
13.5Set309
13.5.1HashSet309
13.5.2TreeSet314
13.5.3LinkedHashSet315
13.5.4Set集合类的性能316
13.6Queue317
13.6.1Queue接口317
13.6.2PriorityQueue类318
13.6.3Deque接口319
13.7Collections类320
13.7.1排序集合中的元素320
13.7.2获取优选和最小元素322
13.7.3在集合中搜索323
13.7.4获取包装器集合324
13.8再探Comparator接口325
13.9深入Map类型328
13.9.1Map接口328
13.9.2Map的工作原理329
13.9.3HashMap331
13.9.4TreeMap332
13.9.5LinkedHashMap333
13.9.6Map性能测试334
13.10遗留的集合336
13.10.1Enumeration接口336
13.10.2Vector类336
13.10.3Stack类337
13.10.4Hashtable类337
13.10.5Properties类337
13.10.6BitSet类339
13.11集合工厂方法340
13.11.1of方法340
13.11.2copyOf方法341
13.12总结342
13.13实战练习342
第14章Stream344
14.1什么是Stream344
14.2创建流345
14.3并行流与串行流348
14.4有序流和无序流348
14.5中间操作348
14.5.1筛选和截断349
14.5.2映射351
14.5.3排序352
14.5.4peek353
14.6终端操作354
14.6.1遍历354
14.6.2查找与匹配355
14.6.3优选/最小与计数356
14.6.4收集统计信息357
14.6.5reduce357
14.6.6collect361
14.7并行流的性能366
14.8总结368
14.9实战练习369
第15章Class类与反射API370
15.1Class<T>类370
15.2获取类型信息372
15.2.1获取方法和字段信息372
15.2.2获取基类和接口信息374
15.2.3获取枚举信息375
15.2.4获取泛型信息376
15.2.5获取注解信息379
15.3检测类型379
15.4使用Class和反射创建类的
对象380
15.5使用反射调用对象的方法383
15.6使用反射修改对象的字段384
15.7依赖注入容器385
15.8动态代理391
15.9ClassLoader395
15.9.1类加载器的分类396
15.9.2类加载器的加载机制397
15.9.3自定义类加载器398
15.10适可而止400
15.11方法句柄401
15.12服务加载器403
15.13总结407
15.14实战练习407
第16章注解(Annotation)408
16.1预定义的注解408
16.1.1@Override408
16.1.2@Deprecated409
16.1.3@SuppressWarnings410
16.1.4@SafeVarargs411
16.1.5@FunctionalInterface412
16.2自定义注解412
16.3元注解413
16.3.1@Documented414
16.3.2@Retention414
16.3.3@Target415
16.3.4@Inherited416
16.3.5@Repeatable416
16.4注解与反射417
16.5编写注解处理器421
16.5.1依赖注入容器的注解实现421
16.5.2使用注解生成数据库表423
16.6总结428
16.7实战练习428
第17章多线程429
17.1基本概念429
17.1.1程序和进程429
17.1.2线程429
17.2Java对多线程的支持430
17.3Java线程430
17.3.1Thread类431
17.3.2创建任务432
17.3.3让步433
17.3.4休眠434
17.3.5优先级436
17.3.6加入一个线程437
17.3.7捕获线程的异常438
17.3.8后台线程440
17.3.9线程组442
17.3.10线程的状态442
17.4线程同步443
17.4.1错误地访问共享资源444
17.4.2同步语句块445
17.4.3同步方法446
17.4.4死锁448
17.5线程本地存储450
17.5.1使用ThreadLocal类450
17.5.2ThreadLocal的实现原理452
17.6生产者与消费者453
17.7线程的终止458
17.7.1取消一个任务458
17.7.2在阻塞中中止459
17.7.3注意清理461
17.8线程池462
17.9总结474
17.10实战练习475
第18章Java常用工具类476
18.1java.lang.Math类476
18.2随机数479
18.2.1Math.random方法479
18.2.2Random类480
18.2.3ThreadLocalRandom类481
18.3大数字运算482
18.3.1BigInteger482
18.3.2BigDecimal486
18.4日期时间工具491
18.4.1Date类492
18.4.2DateFormat类493
18.4.3SimpleDateFormat类495
18.4.4Calendar类497
18.5Java8新增的日期/时间API499
18.5.1新的日期/时间类500
18.5.2构造日期/时间对象500
18.5.3格式化和解析日期/时间
字符串501
18.5.4操作日历字段502
18.5.5计算时间间隔503
18.5.6使用Instant计算某项操作
花费的时间504
18.5.7判断闰年504
18.5.8与Date和Calendar的
相互转换505
18.6Optional类506
18.6.1创建Optional类的实例506
18.6.2判断Optional的值是否
存在506
18.6.3获取Optional的值507
18.6.4过滤与映射508
18.6.5得到Stream对象508
18.6.6为什么要使用Optional509
18.6.7OptionalInt、OptionalLong和OptionalDouble512
18.7Base64编解码512
18.8Timer类514
18.9Runtime类与单例设计模式516
18.10总结518
18.11实战练习518
第19章JavaI/O操作519
19.1File类519
19.1.1分隔符519
19.1.2创建文件夹520
19.1.3文件操作520
19.1.4搜索目录中的文件521
19.1.5移动文件524
19.1.6临时文件525
19.2流式I/O526
19.3输入输出流527
19.3.1InputStream527
19.3.2OutputStream528
19.3.3字节数组输入/输出流529
19.3.4文件输入/输出流530
19.3.5过滤流532
19.3.6缓冲的输入/输出流532
19.3.7数据输入/输出流534
19.3.8管道流535
19.3.9复制文件537
19.4JavaI/O库的设计原则537
19.5Reader和Writer538
19.6InputStreamReader和OutputStreamWriter540
19.7字符集与中文乱码问题542
19.7.1字符集542
19.7.2对乱码产生过程的分析547
19.7.3Charset类549
19.8RandomAccessFile类551
19.9标准I/O552
19.9.1从标准输入中读取数据553
19.9.2Scanner553
19.9.3I/O重定向556
19.10对象序列化557
19.10.1使用对象流实现序列化558
19.10.2对象引用的序列化560
19.10.3序列化过滤器564
19.10.4定制序列化566
19.10.5替换对象568
19.10.6使用Externalizable接口
定制序列化571
19.10.7序列化版本573
19.11NIO573
19.11.1缓冲区(Buffer)574
19.11.2通道(Channel)579
19.11.3使用通道复制文件581
19.11.4视图缓冲区583
19.11.5字节顺序585
19.11.6直接和非直接缓冲区586
19.11.7分散和聚集587
19.11.8字符缓冲区的问题590
19.11.9内存映射文件593
19.11.10对文件加锁598
19.11.11管道599
19.12Files类与Path接口601
19.12.1Path接口601
19.12.2读写文件603
19.12.3遍历目录606
19.12.4小结608
19.13异步文件通道608
19.13.1写入数据609
19.13.2读取数据611
19.14总结613
19.15实战练习613
第20章Java并发编程615
20.1Callable和Future接口615
20.2新的任务执行框架617
20.2.1Executor接口617
20.2.2ExecutorService接口617
20.2.3Executors工具类618
20.2.4ThreadFactory620
20.2.5ScheduledExecutorService621
20.2.6批量执行任务623
20.2.7CompletionService接口625
20.2.8ThreadPoolExecutor类628
20.3锁对象631
20.3.1Lock接口631
20.3.2重入互斥锁632
20.3.3读写锁633
20.3.4StampedLock635
20.4条件对象639
20.5同步工具类642
20.5.1CountDownLatch642
20.5.2CyclicBarrier644
20.5.3Semaphore646
20.5.4Exchanger650
20.6线程安全的集合652
20.6.1写时拷贝653
20.6.2阻塞队列654
20.6.3延迟队列657
20.6.4传输队列660
20.6.5ConcurrentHashMap660
20.6.6ConcurrentSkipListMap662
20.7Fork/Join框架663
20.8CompletableFuture666
20.8.1异步执行任务666
20.8.2构造异步任务链667
20.8.3结果转换668
20.8.4组合异步任务669
20.8.5任务链完成时的结果处理和异常处理670
20.9原子操作675
20.9.1AtomicInteger类676
20.9.2LongAdder679
20.10变量句柄680
20.11总结683
20.12实战练习683
第21章Eclipse开发工具684
21.1Eclipse简介684
21.2下载并安装684
21.3Eclipse开发环境介绍686
21.4配置Eclipse690
21.4.1配置JDK690
21.4.2配置字体691
21.4.3配置和使用快捷键692
21.4.4配置字符集693
21.5开发Java程序693
21.6调试代码696
21.7JUnit单元测试698
21.8导入现有的Eclipse项目702
21.9总结703
21.10实战练习703
第22章图形界面编程704
22.1AWT704
22.1.1第一个AWT应用程序705
22.1.2关闭窗口706
22.1.3向窗口内添加组件708
22.2布局管理器709
22.2.1BorderLayout709
22.2.2FlowLayout711
22.2.3GridLayout713
22.2.4CardLayout714
22.2.5GridBagLayout714
22.2.6组合多个布局管理器716
22.3事件模型718
22.3.1按钮点击事件的处理719
22.3.2事件监听器720
22.3.3观察者模式721
22.4Swing724
22.4.1基本的框架窗口724
22.4.2添加文本域和菜单栏725
22.4.3菜单功能727
22.4.4弹出菜单730
22.5Swing与并发731
22.6使用WindowBuilder快速
开发图形界面程序733
22.6.1安装WindowBuilder734
22.6.2用户登录界面735
22.6.3注册事件监听器739
22.7总结741
22.8实战练习741
第23章Java网络编程742
23.1网络基础知识742
23.1.1计算机网络742
23.1.2IP地址743
23.1.3协议743
23.1.4网络的状况743
23.1.5网络异质性问题的解决744
23.1.6ISO/OSI七层参考模型744
23.1.7数据封装746
23.1.8TCP/IP模型747
23.1.9端口747
23.1.10套接字(Socket)748
23.1.11客户机/服务器模式748
23.2基于TCP的套接字编程748
23.2.1服务器程序749
23.2.2客户端程序751
23.2.3多线程的服务器程序752
23.2.4套接字超时753
23.3基于UDP的套接字编程754
23.3.1接收端755
23.3.2发送端756
23.3.3获取发送端的信息757
23.4非阻塞的套接字编程757
23.4.1SocketChannel757
23.4.2ServerSocketChannel758
23.4.3Selector758
23.4.4非阻塞的服务器程序760
23.4.5非阻塞的客户端程序763
23.5URL和URLConnection764
23.5.1URL类764
23.5.2URLConnection类765
23.5.3一个实用的下载程序765
23.6HTTPClientAPI768
23.6.1HttpClient769
23.6.2HttpRequest770
23.6.3HttpResponse772
23.6.4异步发送多个请求773
23.6.5启用HttpClient的日志
记录功能774
23.7总结775
23.8实战练习775
第24章数据库访问776
24.1JDBC驱动程序的类型776
24.1.1JDBC-ODBC桥777
24.1.2部分本地API的Java
驱动程序777
24.1.3JDBC网络纯Java
驱动程序778
24.1.4本地协议的纯Java
驱动程序778
24.2安装数据库778
24.3下载MySQLJDBC驱动782
24.4JDBCAPI783
24.5加载并注册数据库驱动783
24.5.1Driver接口783
24.5.2加载与注册JDBC驱动784
24.5.3服务加载786
24.6建立到数据库的连接788
24.7访问数据库789
24.7.1Statement789
24.7.2ResultSet792
24.7.3PreparedStatement796
24.7.4CallableStatement798
24.7.5元数据799
24.8事务处理802
24.9可滚动和可更新的结果集806
24.9.1可滚动的结果集806
24.9.2可更新的结果集807
24.10行集808
24.10.1行集的标准实现808
24.10.2行集的事件模型809
24.10.3CachedRowSet810
24.11JDBC数据源和连接池811
24.12总结812
24.13实战练习813
第25章Java平台模块系统814
25.1Java平台的模块814
25.2模块的物理结构816
25.3创建模块817
25.4模块依赖818
25.5导出包819
25.6可传递的模块与静态依赖821
25.7开放包821
25.8限定导出和开放824
25.9服务加载824
25.10未命名模块825
25.11自动模块826
25.12为什么要引入模块系统827
25.13总结828
25.14实战练习828