数组
特点
- 数组长度固定,所以在声明阶段必须显示的声明数组长度
1 | // 声明一个长度为10的int数组var |
数组的长度必须是常量表达式,因为数组的长度需要在编译阶段确定
同类型数组之间可以相互比较。如果一个数组的元素类型是可以相互比较的,那么数组类型也是可以相互比较的,这时候我们可以直接通过
==
比较运算符来比较两个数组,只有当两个数组的所有元素都是相等的时候数组才是相等的
1 | a := [2]int{1, 2} |
1 | // 声明一个长度为10的int数组var |
数组的长度必须是常量表达式,因为数组的长度需要在编译阶段确定
同类型数组之间可以相互比较。如果一个数组的元素类型是可以相互比较的,那么数组类型也是可以相互比较的,这时候我们可以直接通过==
比较运算符来比较两个数组,只有当两个数组的所有元素都是相等的时候数组才是相等的
1 | a := [2]int{1, 2} |
GO语言中的字符串是由UTF-8编码的,所以GO语言字符串是变宽字符序列,每一个字符都用1到4个字节表示。
字符串的值是不可变的,意味着:
如果两个字符串共享相同的底层数据的话也是安全的,这使得复制任何长度的字符串代价是低廉的。
同样,一个字符串s和对应的子字符串切片s[7:]的操作也可以安全地共享相同的内存,因此字符串切片操作代价也是低廉的。
在这两种情况下都没有必要分配新的内存。
注意:Go语言的range循环在处理字符串的时候,会自动隐式解码UTF8字符串
bytes.Buffer
是一个实现了读写方法的可变大小的字节缓冲。
使用bytes.Buffer
进行字符串的累加比起+=要高效的多,尤其是在面对大数量的字符串时
1 | var b bytes.Buffer // A Buffer needs no initialization. |
Mutator 即用户线程,Collector 为 GC 线程。
Serial GC:只有一个 Collector
Parallel GC:支持多个 Collector 同时回收
Concurrent GC:Mutator 和 Collector 可用同时执行
被回收的条件:不可达的对象
过程:
标记根对象 (GC roots): 静态变量、全局变量、常量、线程栈等标记为存活
标记:从根对象出发,找到所有可达对象
清理:回收所有不可达对象占据的内存空间。清理策略如下:
对一个完全二叉树进行层序遍历时,其特点就是:若遍历到一个节点左/右子树为空,那么这个节点的所有右边的节点和下层节点的左右子树都为空。可以根据这个特性来进行二叉树的完全性检验
1 | /** |
x
,首先查看数组中是否有x-1
,若有则跳过x
;若没有x-1
,则进行枚举x+1, x+2, ...
,同时记录连续序列的长度,从而得到最长连续序列的长度1 | func longestConsecutive(nums []int) int { |
因为整个升序数组在旋转后,可以分为两部分,并且这两部分都是升序排列的,同时第一部分的所有元素比第二部分的所有元素大。基于二分查找,通过判断mid
指向第一部分还是第二部分来更新low
和high
指针:
nums[mid] > nums[high]
,则mid
指向第一部分,最小元素在mid
左侧,low
更新为mid+1
mid
指向第二部分,最小元素为mid
或者在mid
右侧,high
更新为mid
1 | func findMin(nums []int) int { |
因为nums[-1] = nums[n] = -∞
,索引找到数组中的最大值即可,这个最大值就是峰值
爬坡的思想,随机一个下标i
,沿着上升的方向走,一定可以到峰值
nums[i] < nums[i+1]
,则向右侧走一定可以到达峰值基于二分查找,查找时比较nums[mid]
与nums[mid+1]
的值:
nums[mid] < nums[mid+1]
,则右侧存在峰值,low = mid+1
high = mid
1 | func findPeakElement(nums []int) int { |
1 | func findPeakElement(nums []int) int { |
1 | func findPeakElement(nums []int) int { |
查看索引
1 | SHOW INDEX FROM 表名; |
1 | CREATE TABLE dept( |
InnoDB将数据划分为若干个页,InnoDB中数据页的默认大小为16KB。数据库管理存储空间的基本单位是页,数据库IO操作的最小单位是页。
页之间不在物理上相邻,通过双向链表相关联。数据页中的每条记录通过单向链表按照顺序连接
数据库中,还存在着区(Extent)、段(Segment)和表空间(Tablespace)的概念。它们的关系如下:
区(Extent):比页大一级的存储结构,在InnoDB中,一个区会分配64个连续的页。一个区的大小是64*16KB=1MB
段(Segment):由一个或者多个区组成,区在文件系统中是一个连续的空间,在段中区之间不要求相邻。段是数据库中的分配单位,不同类型的数据库对象以不同的段形式存在。在创建数据表、索引的时候会创建相应的段
表空间(Tablespace):是一个逻辑容器,一个表空间中有一个或者多个段。数据库由一个或者多个表空间组成,表空间从管理上可以划分为系统表空间、用户表空间、撤销表空间、临时表空间等。
页的内部结构可以分为7个部分,分别是文件头、页头、最大最小记录、用户记录、空闲空间、页目录、文件尾: