算法分析(algs4)
时间:
算法增长数量级的分类
典型的增长数量级函数
内存:
变量的类型的内存
对象
链表
嵌套的非静态(内部)类需要额外的8字节(用于一个指向外部类的引用)。
例如
Node: 40=16+8+8+8
数组
原始数据类型数组
Java中数组被实现为对象,它们一般都会因为记录长度而需要额外的内存。
原始数据类型数组=24字节头信息(16字节的对象开销+4字节保存长度+4填充字节)+保存值所需要的内存。
例如
int[n] :24(16+4+4)+4n(会被扩充为8的倍数);
double[n]:24+8n
对象的数组
对象的数组就是对象的引用的数组。
对象数组的内存=对象所需的内存+引用所需的内存
例如
Date[n] :24(数组开销)+8n(引用)+32n(对象);
数组的数组(二维数组)
例如
Double[m][n] : 24(数组的数组的开销)+8m(所有元素数组的引用)+24m(所有元素数组的开销)+8mn(m个长度为n的double类型的数组)
字符串对象
String对象
String类型对象的标准实现含有4个实例变量:一个指向字符串数组的引用(8字节)和3个int值(各4字节)。
第一个int值描述的是字符数组中的偏移量,第二个int值描述的是一个计数器(字符串的长度),第三个int值是一个散列值。
因此,每个String对象总共使用40字节(=16字节表示对象+三个int实例变量各需4字节+数组引用的8字节+4个填充字节)
字符数组所需的内存需要另记。String的char数组常常是在多个字符串之间共享的,这样可以节省内存。
子字符串
一个长度为n的String对象一般需要40字节(String对象本身)+(24+2n)字节(字符数组),总共(64+2n)字节。
调用substring()方法时,就创建了一个新的String对象(40字节),但他仍然重用了相同的value[]数组。因此该字符串的子字符串只会使用40字节的内存。