数组:线性表
-
数组基本概念
数组(Array)是一种线性表结构,用一串连续的内存空间,存储相同类型的数据。
-
数组的特点
线性表结构,相同有的链表、队列、栈;
非线性结构有二叉树、堆、图等;
随机访问:
根据坐标来计算访问地址:内存分配起始地址+坐标*存储数据结构占用空间大小;
-
数组和链表的区别
链表插入、删除快,时间复杂度O(1);
数组适合查找,根据坐标查找时间复杂度O(1);
优化插入和删除
插入:直接将第K位的数据移到数组尾,再将数据移到第K位;这个是快排的处理思想;
删除:先记录下要删除的数据,每次删除并不是真正的删除,只是记录数据已被删除,当数组没有空间存储多余数据的时候,再执行一次真正的删除,大大减少数据删除导致的位移。这个也是JVM的标记清除垃圾回收的算法。
-
数组下表为什么从0开始
随机访问少一次运算,减少cpu销售;
jvm是c++开发,沿用c++习惯;
-
警惕数组越界
-
容器能否完全代替数组
ArrayList的优势:将数组操作的细节封装起来;支持动态扩容;最好在创建ArrayList的时候制定数组大小;
ArrayList无法存储基本类型,需要封装Integer、Long,自动装箱、拆箱消耗性能,追求性能使用数组;
数据的大小已知,对数组的操作简单,用不到ArrayList;
多维数组的时候,使用Object[]更直观;
-
java垃圾回收算法-标记清除垃圾回收算法
JVM标记清除算法:
大多数主流虚拟机采用可达性分析算法来判断对象是否存活,在标记阶段,会遍历所有 GC ROOTS,将所有 GC ROOTS 可达的对象标记为存活。只有当标记工作完成后,清理工作才会开始。
不足:1.效率问题。标记和清理效率都不高,但是当知道只有少量垃圾产生时会很高效。2.空间问题。会产生不连续的内存空间碎片。
-
二位数组的内存寻址公式
对于 m * n 的数组,a [ i ][ j ] (i < m,j < n)的地址为:
address = base_address + ( i * n + j) * type_size