Java 开发
本文记录 Java 开发过程的相关知识,以备查阅。
常用类库Apache Commons:对 JDK 的扩展,包含了很多开源工具,常用包如下:
组件
功能说明
Commons BeanUtils
针对 Bean 的工具集,使用反射机制实现
Commons Codec
编码解码组件,如 DES,SHA1,MD5,Base64 等
Commons Collections
集合组件,扩展 Java 标准的 Collections API
Commons Compress
压缩解压组件
Commons Configuration
配置管理工具
Commons CSV
读写 CSV 文件
Commons Daemon
将普通的 Java 应用转变为系统的后台服务,如 Tomcat
Commons DBCP
数据库连接池
Commons DBUtils
对传统操作数据库的类二次封装
Commons Digester
是 XML 到 Java 对象的映射工具集
Commons Email
邮件操作组件
Commons Exec
提供一些常用 ...
《操作系统原理与设计》笔记
本文用于整理《操作系统原理与设计》课程上所使用 Slides 的笔记,以备查阅。
第一章 操作系统概览计算机系统概览:
系统组织:由 CPU 连接总线,通过设备控制器,和其他 IO 设备进行交互
存储结构:采用三角形式的存储结构,通过缓存来提高性能,也通过 DMA 技术提高外存性能
系统架构:多处理器系统,多核系统,集群系统
操作系统概览:
多道程序(multiprogramming):用于提高 CPU 利用率
多任务处理(multitasking):用于提高任务的可交互性
中断驱动理念:硬件中断通过设备产生,软件中断(exception/trap)则由程序错误,系统调用等产生
双模式运作(dual-mode):通过 mode bit 来区分是 user mode 还是 kernel mode,后者具有更高权限
系统调用:由内核提供给上层的 api,用于屏蔽与底层硬件交互的过程
操作系统标准:POSIX 和 BSD,分别实现的操作系统有 Linux 和 MacOS
操作系统组件:
进程:是程序的运行时实例,在 Linux 中通过树结构维护父子关系,需要提供同步, ...
《深入理解计算机系统》笔记
本文用于记录《深入学习计算机系统》中的知识点,以备查阅。
第二章 信息的表示和处理字节顺序:大尾端(sun,sparc)和小尾端(x86,arm),看低地址放的是 MSB 字节还是 LSB 字节
位操作:& | ~ ^ << >> >>>
整数表示:
无符号:$\sum_{i = 0}^{w - 1}x_i * 2^i$,有符号:$-x_{w - 1}*2^{w - 1} + \sum_{i = 0}^{w - 2}x_i * 2^i$
无符号与有符号之间的变换:保持每个位不变,但是按照转换后的整数类型解释
如果表达式中既有无符号整数,也有有符号整数,那么有符号整数会被解释成无符号整数(ux > -1)
在判断表达式真假的时候,可以使用 0,-1,Tmin 等特殊值检验
扩展:符号扩展,0 扩展
截断:去掉最高的那些位
除法:整数除法中由于截断,正整数结果趋近 0,负整数结果远离 0
浮点数表示:
IEEE 标准:采用 $(-1)^s M * 2^E$ 表示,注意阶码偏移(单精度 ...
《高级数据库系统》笔记
本文用于整理《高级数据库系统中》的知识点,以备查阅。
第一章 数据库系统概述基本概念:数据,数据库,数据库模式,数据库管理系统,数据库系统。
Megatron 2000 数据库的问题:
元组平铺在磁盘上,删除更新操作代价大
低级的查询处理
无缓冲区管理,IO 代价大
无并发控制,不能保证数据库的一致性
无索引,查询效率低
无故障恢复
数据库模式设计不规范的话会带来很多问题,如数据冗余,更新异常,插入异常,删除异常,可以进行模式分解来解决该问题。
数据库语言类型:DDL,DML,DCL
第二章 关系数据库回顾ANSI/SPARC 体系结构:三级模式结构和两级映像,确保了数据的独立性。
关系模型中的概念:超码,候选码,主码,替换码,外码
关系模型的三类完整性:
实体完整性
参照完整性,可为空
用户自定义完整性
关系代数:并,交,差,笛卡尔积,选择,投影,联接(自然联接和等值连接区别),除
第三章 存储介质存储器访问延迟:
磁盘结构:盘片,盘面,磁头,磁道,扇区,柱面,扇区之间存在间隙
磁盘块的存取时间:块是 DBMS 中的数据存取的最小单元,扇区是磁盘中数据存 ...
《算法》备忘录
本文用于在算法学习过程中,总结相关算法套路以及算法编写经验,以备查阅。
算法复杂度及其分析算法复杂度表示方法:
$O$:表示算法的渐进上界
$\Omega$:表示算法的渐进下界
$\Theta$:表示算法的渐进紧确界
递归算法复杂度分析:
递归树方法:节点的总个数就是这个算法的时间复杂度
代入检测法:猜测时间复杂度,然后代入看是否满足题意,最后归纳总结
差分方程法:首先计算出对应的齐次方程解,然后代入初始值求解常数项目
主方法:令 $a \ge 1, b > 1$ 是常数,$f(n)$ 是一个函数,T(n) 是非负整数上的递推式: $$ T(n) = aT(\frac{n}{b}) + f(n) $$ T(n) 有以下方法紧确界:
如果存在 $\epsilon > 0$,使得 $f(n) = O(n^{log_ba - \epsilon})$,则 $T(n) = \Theta(n^{log_ba})$
如果 $f(n) = O(n^{log_ba})$,则 $T(n) = \Th ...
Deepin 使用手册
本文用于记录在使用 Deepin 20.x 过程中遇到的问题以及解决方案。
Deepin 装机初始化脚本每次装机都需要手动安装一系列的安装,很麻烦,可以使用脚本安装必备软件:
12345678910111213#!/bin/bashsudo apt install spark-storesudo apt install typorasudo apt install google-chrome-stablesudo apt install codesudo apt install netease-cloud-musicsudo apt install timeshiftsudo apt install qv2raysudo apt install goldendictsudo apt install vlcsudo apt install okularsudo apt install wps-office
阿里云盘挂载通过 aliyundrive-webdav 下载插件为阿里云盘提供 webdav 服务,获取 refresh_token 后在命令行执行命令即可开启 webd ...
《Java》备忘录
本文用于记录 Java 相关知识,以备查阅。
01 面向对象面向对象的三大特征:
封装:通过访问修饰符实现,优点是减少耦合,提高软件的可重用性
继承:通过 extends 实现,表示 is-a 的关系
多态:编译时多态指的是方法的重载,运行时多态指的是对象引用所指向的具体类型在运行期间才确定,运行时多态通过继承,重写,向上转型实现
02 基础知识数据类型:8 种基本类型,对应 8 种包装类型,通过 xxxValue 和 valueOf 自动拆箱和装箱
缓存池:
基本类型:除了 long,float 和 double,其它类型都有一字节的缓存池
String:字面量创建会先从常量池获取,没有的话再创建,new 创建不会加入常量池
String:被声明为 final,内部存储的 value 数组也被声明为 final,同时内部没有改变 value 指向的方法,因此保证了 String 类不可变,不可变的好处:
可以缓存 hash 值
String Pool 的需要,如果可变将没有意义
安全性和线程安全
String,StringBuilder,StringBuffer: ...
《REDIS》备忘录
本文用于记录 Redis 相关知识,以备查阅。
01 Redis 数据结构Redis 数据类型是其值的数据类型,这些数据类型会使用相应的数据结构来实现,对应关系如下:
Redis 本身使用了哈希表来保存所有的数据,哈希桶存放的是键值对的指针,指针的类型都通过对象结构来解码,里面包含了 type,encoding,ptr 等信息,整个映射过程如下:
SDS:保存为 (len, alloc, flags, buf[]) ,其有以下优点:常量时间复杂度内获取字符串长度,二进制安全,不会发生缓冲区溢出,节省内存空间,另外为了节省空间,使用了 __attribute__ ((packed))
双向链表:实现为具有头节点的双向链表,能够快速获取到头尾节点和链表长度等信息,但是存在无法很好利用 CPU 缓存和在数据较小时,内存开销较大的问题
压缩列表:内存紧凑型的数据结构,占用一块连续的内存空间,不仅可以利用 CPU 缓存,而且会针对不同长度的数据,进行相应编码,节省内存空间。但是其不能保存过多的元素,并且新增或者修改元素时,可能引发连锁更新的问题(通过 prevlen 长度改变造成)
...
《MYSQL》备忘录
用于整理 MySQL 的相关知识,以备查询。
01 MySQL 概览存储引擎:
InnoDB:支持事务,支持行级锁,支持外键,采用 MVCC 支持高并发,支持四个隔离级别
MyISAM:不支持事务,只支持表锁,支持压缩表和空间数据索引,数据恢复困难
索引数据结构:
AVL 树:左右子树树高相差不超过 1 的平衡二叉树,插入和删除会引入旋转操作,适合查找多的场景
红黑树:确保没有一条路径会比其他路径长 2 倍,近似平衡,适合插入删除操作多的场景
跳表:平均性能和红黑树相当,但实现更为简单
B 树:多路查找树,中间节点也会携带实际数据
B+ 树:多路查找树,只有叶子节点才会携带实际数据,查询性能稳定
B+ 树和红黑树比较:
B+ 树一个节点可以存储多个元素,相较于红黑树树高更低,磁盘 IO 次数小
磁盘预读功能对 B+ 树产生优化功能
B+ 树和 B 树比较:
B+ 树磁盘 IO 更低,其内部节点全部是指针,没有实际数据,能够更快找到元素
B+ 树查询效率更加稳定
B+ 树遍历效率高
MySQL 索引:在存储层实现,不同的存储引擎具有不同的索引类型
B+ 树索引: ...
《计算机系统》备忘录
计算机系统的相关知识,总结于此,以备查询。
01 内存管理虚拟内存:单片机程序写完后会将其进行烧录,程序里面的地址都是内存的物理地址,这给同时运行多个程序带来了困难,为此,可以在物理地址上层提供虚拟地址,程序看到的都是虚拟地址,而物理地址对其是透明的。为了管理虚拟地址和物理地址之间的关系,一般有内存分段和内存分页方式。
内存分段:程序由不同的逻辑段构成,如代码段,数据段,栈段等。分段下的虚拟地址表示为段选择子和段内偏移量,地址转换过程如下:
内存分段的缺点:内外部碎片严重,内存交换效率低。
内存分页:分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小,称其为页,映射过程:
分页很好地解决了内外部碎片和内存交换的问题,但是也存在以下问题:
简单的分页方式浪费内存:可以使用多级页表的方式解决
多级页表转换过程需要更多的时间:引入 TLB,快速进行转换
段页式内存:先将程序划分为多个有逻辑意义的段,接着再把每个段划分为多个页,此时地址结构就由段号、段内页号和页内偏移三部分组成,该方案能提高内存的利用率。
Linux 内存管理:主要采用的是页式内存管理,但同时也不可避免地涉 ...