为什么数组从零开始
数组是一种线性表数据结构 连续的内存空间来存储一组具有相同类型的数据
数组支持随机访问 根据下标随机访问的时间复杂度为1 适合查找
插入和删除这两个操作比较低效
避免数据搬移 可以先记录下已经删除的数据 每次的删除并不是真正地搬移数据 只是记录数据已经被删除 当数组没有更多空间存储数据时 再触发执行一次真正的删除操作 这样就大大减少了删除操作导致的数据迁移
警惕数组越界的问题 在c语言当中 只要不是访问受限的内存 所有的内存空间都是可以自由访问的 根据数组寻址公式 会定位到某个不属于数组的内存地址上 导致代码的无限循环
访问数组的本质就是访问一段连续内存 只要数组通过偏移计算得到的内存地址是可用的 那么程序有可能不会报任何错误
计算机病毒很多也是利用数组越界访问非法地址的漏洞 来攻击系统 一定要警惕数组越界
c语言当中数组越界检查的工作是給程序员来做的 java则是本身会做越界检查
java提供了容器类 ArrayList
最大的优势是将很多数组的操作封装起来 支持动态扩容
作为高级语言编程者,是不是数组就无用武之地了呢?当然不是
1.Java ArrayList 无法存储基本类型,比如 int long 需要进行封装
2.数据大小事先已知 并且操作简单 可以直接使用数组
3.多维数组情况下 数组更加直观比如 Object[][] array
业务开发情况下 直接使用容器即可 省时省力 做非常底层的开发
性能的优化做到极致 数组优于容器
下标其实是偏移 从1开始计数 每次随机访问元素都需要多一次减法操作
效率优化做到极致?
主要还是历史原因 c语言设计值用0开始计数数组下标。
无论是java js等都是进行模仿
python支持负数下标。
顺便复习学习一下java语言
google家的规范是 2个空格作为缩进!!!
1 | package array; |