数据结构与算法之美--知识点二:数组

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元素同类型,否则这段代码仍是未决行为。

GCC 中的编译器堆栈保护技术

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值