【工作】《码出高效》读书笔记

2020-05-14  本文已影响0人  苏柏亚的星空

第1章 计算机基础

追根究底是深度分析和解决问题、提升程序员素质的关键所在,有助于编写高质
的代码。基础知识的深度认知决定着知识上层建筑的延展性。试问 对于如下的基
础知识,你的认知是否足够清晰呢?

本章从编程的角度深度探讨计算机组成原理、计算机网络、信息安全等相关内容,与具体编程语言无关。本章将不会讨论内部硬件的工作原理、网络世界的协议和底层传输方式、 全领域的攻防类型等内容。

1.1 走进0与1的世界

1.2 浮点数

1.2.1 科学计数法

1.2.2 浮点数表示

1.2.3 加减运算(解释浮点运算的偏差原因)

1.2.4 浮点数使用

1.3 字符集与乱码

1.4 CPU与内存

1.5 TCP/IP

1.5.1 网络协议

1.5.2 IP协议

1.5.3 TCP握手

需要三次握手的原因:信息对等、防止脏连接


image.png

1.5.4 TCP 断开连接

四次挥手


image.png

1.5.5 连接池

1.6 信息安全

1.6.1 黑客与安全

1.6.2 SQL注入

1.6.3 XSS与CSRF

1.6.4 CSRF(跨站请求伪造)

1.6.5 HTTPS

1.7 编程语言的发展

第2章 面向对象

本章开始讲解面向对象思想,并以 Java 为载体讲述面向对象思想在具体编程语
言中的运用与实践。当前主流的编程语言有50种左右,主要分为两大阵营:面向对象编程与面向过程编程。
面向对象编程( object -Oriented Programming, OOP )是划时代的编程思想变革,推动了高级语言的快速发展和工业化进程。 OOP的抽象、封装、继承、多态的理念使软件大规模化成为可能,有效地降低了软件开发成本、维护成本和复用成本。面向对象编程思想完全不同于传统的面向过程编程思想,使大型软件的开发就像搭积木那样隔离可控、高效简单,是当今编程领域的一股势不可当的潮流。 OOP 实践了软件工程的三个主要目标:可维护性、可重用性和可扩展性。

2.1 OOP理念

2.2 初识JAVA

2.3 类

2.3.1 类的定义

2.3.2 接口与抽象类

2.3.3 内部类

无论是什么类型的内部类,都会编译成一个独立的class文件
类加载与外部类在同一个阶段进行。JDK源码中定义包内可见静态内部
类的方式很常见,这样做的好处是:

2.3.4 访问权限控制

2.3.5 this 与 super

2.3.6 类关系

随着业务和架构的发展,类与类的关系是会发生变化的。

2.3.7 序列化

2.4 方法

2.4.1 方法签名

2.4.2 参数

2.4.3 构造方法

创建类对象时,会先执行父类和子类的静态代码块 然后再执行父类和子类的构造方法。并不是执行完父类的静态代码块和构造方法后,再去执行子类。静态代码块只运行一次,在第二次对象实例化时,不会运行。

2.4.4 类内方法

2.4.5 getter setter

2.4.6 同步与异步

2.4.7 覆写

2.5 重载

JVM在重载方法中,选择合适的目标方法的顺序如下:
1)精确匹配
2)如果是基本数据类型,自动转换为更大表示类型的数据类型
3)自动拆箱与装箱
4)从子类向上转型类型依次匹配
5)通过可变参数匹配

2.6 泛型

2.7 数据类型

2.7.1 基本数据类型

2.7.2 包装类型

2.7.3 字符串

第3章 代码风格

一致性很重要。
代码风格并不影响程序运行,没有潜在的故障风险,通常与数据结构、逻辑表达无关,是指不可见字符的展示方式、代码元素的命名方式和代码注释风格等。比如,大括号是否换行、缩进方式、常量与变量的命名方式、注释是否统一放置在代码上方等。代码风格的主要诉求是清爽统一、便于阅读和维护。统一的代码风格可以让开发工程师们没有严重的代码心理壁垒,每个人都可以轻松地阅读并快速理解代码逻辑,便于高效协作,逐步形成团队的代码“味道”。

3.1 命名规约

3.1.1 常量

3.1.2 变量

3.2 代码展示风格

3.2.1 缩进、空格与空行

3.2.2 换行与高度

3.2.3 控制语句

3.3 代码注释

3.3.1 注释三要素

3.3.2 注释格式

第4章 走进JVM

Oracle的HotSpot JVM 实现,是目前最主流的JAVA虚拟机。它采用解释与编译混合执行的模式。本章从字节码说起,分析类加载的过程,并结合内存布局,讲解对象创建与垃圾回收等各个知识点。

4.1 字节码

主要指令类型有

4.2 类加载过程

类加载器的分层体系

其中Bootstrap是c语言实现的,后面是JAVA实现的
类加载器具有等级制度,但是并无继承关系,以组合的方式来复用父加载器的功能。
-XX:+TraceClassLoading可以查看加载了哪个jar中哪个类。
下图说明了类的加载顺序和覆盖机制,即高层优先,低层不能覆盖高层。

image.png

用户可以自定义类加载器

4.3 内存布局

image.png image.png

4.4 对象实例化

4.5 垃圾回收

主要GC算法:

第5章 异常与日志

捕获异常时需要分清稳定代码和非稳定代码。
如果异常在当前方法的处理能力范围之内且没有必要对外透出,那么就直接
捕获异常并做相应处理;否则向上抛出,由上层方法或者框架来处理。

5.1 异常分类

5.2 try 代码块

5.3 异常的抛与接

5.4 日志

5.4.1 日志规范

5.4.2 日志框架

image.png

第6章 数据结构与集合

本书中其他地方出现的集合概念,都指的是 Collection来保存各种各样的对象。非是数学意义上的Set(互异)。在进入高并发编程时代后,由集合引发的相关故障占比越来越高。比如,多线程共享集合时出现的脏数据问题,某些集合在数据扩容时出现节点之间的死链问题;写多读少的场景误用某些集合导致性能下降问题等。本章将从数组讲起,引申到集合框架,再到重点集合源码分析,最后介绍高并发集合框架,目的是对集合的了解成竹在胸、运用得心应手。

6.1 数据结构

6.2 集合框架图

image.png

6.2.1 List 集合

6.2.2 Queue 集合

6.2.3 Map 集合

6.2.4 Set 集合

6.3 集合初始化

6.4 数组与集合

6.5 集合与泛型

6.6 元素的比较

6.6.1 Comparable和Comparator

6.6.2 hashCode和equals

6. 7 fail-fast 机制

6.8 Map 类集合

image.png

6.8.1 红黑树

6.8.2 TreeMap

6.8.3 HashMap

6.8.4 ConcurrentHashMap

第7章 并发与多线程

并发与并行两个概念非常容易混淆,它们的核心区别在于进程是否同时执行。以 KTV 唱歌为例,并行指的是有多少人可以使用话筒同时唱歌,并发指的是同一个话筒被多个人轮流使用。

7.1 线程安全

7.2 什么是锁

7.3 线程同步

7.3.1 同步是什么

7.3.2 volatile

7.3.3 信号量同步

7.4 线程池

7.4.1 线程池的好处

ThreadPoolExecutor 的构造方法:

 public ThreadPoolExecutor(int corePoolSize, 常驻核心线程数
                              int maximumPoolSize, 同时执行的最大线程数
                              long keepAliveTime, 线程池中的线程空闲时间 
                              TimeUnit unit, 时间单位
                              BlockingQueue<Runnable> workQueue, 缓存队列
                              ThreadFactory threadFactory, 线程工厂
                              RejectedExecutionHandler handler 执行拒绝策略的对象
)

7.4.2 线程池源码详解

7.5 ThreadLocal

7.5.1引用类型

7.5.2 Threadlocal 价值

7.5.3 ThreadLocal 副作用

第8章 单元测试

8.1 单元测试的基本原则

8.2 单元测试覆盖率

8.3 单元测试编写

8.3.1 JUnit 单元测试框架

8.3.2 命名

8.3.3 断言与假设

第9章 代码规约

9.1 代码规约的意义

9.2 如何推动落地

9.3 手册纵览

9.4 聊聊成长

上一篇下一篇

猜你喜欢

热点阅读