05 | 数组:为什么很多编程语言中数组都从0开始编号?
数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。
JVM标记清除垃圾回收算法。每次的删除操作并不是真正地搬移数据,只是记录数据已经被删除。当数组没有更多空间存储数据时,我们再触发执行一次真正的删除操作,这样就大大减少了删除操作导致的数据搬移。
JVM 之垃圾回收算法(标记 -清除、复制、标记-整理、分代收集)
数组 vs. 容器
Java ArrayList无法存储基本类型,比如int、long,需要封装为Integer、Long类,而Autoboxing、Unboxing则有一定的性能消耗,所以如果特别关注性能,或者希望使用基本类型,就可以选用数组。
如果数据大小事先已知,并且对数据的操作非常简单,用不到ArrayList提供的大部分方法,也可以直接使用数组。
当要表示多维数组时,用数组往往会增加直观。比如Object[][] array; 而用容器的话则需要这样定义:ArrayList array。看个人喜好。
对于业务开发,直接使用容器就足够了,省时省力。毕竟损耗一些性能,并不影响到系统整体的性能。但如果做一些非常底层的开发,比如开发网络框架,性能的优化需要做到极致,这个时候数组就会优于容器,成为首选。
下标,偏移,offset
a[k]_address = base_address + k * type_size
函数体内的局部变量存在栈上,且是连续压栈。在Linux进程的内存布局中,栈区在高地址空间,从高向低增长。变量i和arr在相邻地址,且i比arr的地址大,所以arr越界正好访问到i。当前,前提是i和arr元素同类型,否则这段代码仍是未决行为。
int main(int argc, char* argv[]){
int i = 0;
int arr[3] = {0};
for(; i<=3; i++){
arr[i] = 0;
printf("hello world\n");
}
return 0;
}