《数据结构与算法》1-数组

大学的时候学习Java的数据结构特别的难过,各种刁钻的demo示例展示数据结构的恶心,那时候死记硬背的结果就是快速的遗忘。在工作之后,写出能运行的代码的时候就算是交工了。很少会认真思考数据结构对代码带来的影像。直到后来为了面试,经常被问到数据结构的问题才开始后悔平时没有多思考总结。知识也不会因为你的临阵磨枪给你任何奖赏。只有回国头来仔细的思考其中的原理,才可能融汇贯通,牢记心间。

数据结构这门课是在Springboot 设计思想学习过程中穿插学习的内容。因为对于数据结构抱着深深的怨念,所以私认为此役一定要战胜数据结构和算法。不能重复栽在同一部分内容上。

这个系列的第一部分内容是数组。在java中数组是一种类(Class)。跟int char byte 一样是原生类型。在代码中显示

    public static void main(String[] args) throws JSONException {

        int[] arras = new int[2];
        Class clazs = arras.getClass();
        System.out.println(clazs);
    }

输出结果是class [I   .非常的刺激。

数组的特性:

  • 一种线性表,是一种前后关系。每个元素只能有前 后两个方向。
  • 是连续的内容。最好的优点是随机访问,因为是连续的地址,所以我们只要知道开始地址,然后dataSize*index就是指定的元素位置。

数组的优化

数组的随机访问是个优点,但是在插入和删除操作的时候会表现比较差,因为当我们在一个长度为10的数组种,删除第3个数据,为了保持数据的连贯性,只能把4-10的数据重新复制到3-9的位置。这样就增加了复杂度。插入也是一样,当我们在长度为10的数组种在第四个位置插入一个新的数据时,我们需要申请一个长度为11的数组,把1-3的数据先复制到新的数组中,然后在第四的位置加入新的数据,然后把原始的4-10的数据复制到新数组的5-11位置。

那么有没有优化操作呢?答案是肯定的。

数组插入操作优化:以长度为10,插入到第4个位置为例

  • 新申请一个数组,长度是原始数据的leng+1,即11;
  • 把原始的数据内容复制到新的数组种
  • 把新数组的第4位的数据更新为新插入的数据
  • 把原始第四位的数据赋值到新数组的第11位

如上操作就避免了数据的大量复制

数组删除操作优化:以长度为10,数据不满的情况下,删除前三个数据为例

  • 标记前三个数据为已删除
  • 如果新增的话可以在数组后面新增
  • 如果再删除的话可以标记下标的数据为删除。
  • 当新增数据的时候,发现数组已满,可以批量删除被标注为已删除的数据,或者复制所有为删除的数据到另一个新的数组

上面的操作就避免了每次删除的赋值操作,在jvm中的垃圾回收算法中就有标记删除,或者标记整理算法。跟上面的算法非常接近

集合能否替代数组?

现在java种提供了很完善的集合数据类型。ArrayList是数组列表,封装了数据扩容和数据复制的工作。而数组需要自我实现。所以ArrayList比较简单。但是有一些情况,ArrayList并不能全部替换数组

  • 存储基本类型的时候,数组可以实现int[] ,char[]但是ArrayList只能存储原始类型。即包装类型Integer等
  • 固定长度的数据量,不需要扩容操作的时候,可以用数组替换。
  • 多维数组

 

猜你喜欢

转载自blog.csdn.net/David_lou/article/details/108569168