zoukankan      html  css  js  c++  java
  • 《数据结构与算法之美》03——数组

    一、概念

    数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

    关键词:

    1. 线性表(Linear List),线性表就是数据排成像一条线一样的结构。

     

    相对的是,非线性表

     

    2. 连续的内存空间和相同类型的数据。

    有这两个限制,有一个特性:随机访问。通过内存空间地址来获取数组元素。

    二、警惕数组的访问越界问题

    C语言为例,只要不是访问受限的内存,所有的内存空间都是可以自由访问的。

    JavaC#为例,数组越界时会抛出异常。

    三、容器能否完全替换数组

    JavaArrayLisit为例(同比C#List),最大的优势是可以将很多数组操作的细节封装起来,并且支持动态扩容。

    注意:动态扩容涉及内存申请和数据搬移,如果事先能确定需要存储的灵气大小,最好在创建时就指定数据大小。

    相比于容器,数组是否无用武之地?

    1. JavaArrayList无法存储基本类型,会涉及到AutoboxingUnboxing,对性能有一定的消耗,如果关注性能,选择数组。

    2. 如果数据大小已知,并且对数据的操作非常简单,可直接使用数组。

    3. 表示多维数组时,用数组往往会更加直观。

    但对于业务开发,直接使用容器就足够了,省时省力。

    课后思考:

    1. 前面我基于数组的原理引出JVM的标记清除垃圾回收算法的核心理念。我不知道你是否使

    Java语言,理解JVM,如果你熟悉,可以在评论区回顾下你理解的标记清除垃圾回收算法。

    使用的是C#,一样有GC

    有两个阶段:

    阶段1Mark-Sweep标记清除阶段

    阶段2Compact压缩阶段

     

    参考资料:https://kb.cnblogs.com/page/106720/

    2. 前面我们讲到一维数组的内存寻址公式,那你可以思考一下,类比一下,二维数组的内存寻址公式是怎样的呢?

    a[i][j]_address = base_address + (i * col_count + j) * data_type_size

  • 相关阅读:
    html中frameset的详细使用方法
    日期控件API
    限制input输入类型(多种方法实现)
    springmvc导出excel并弹出下载框
    Spring mvc 验证码的做法
    Spring Boot 集成MyBatis
    Spring Boot 实践折腾记(三):三板斧,Spring Boot下使用Mybatis
    支付系统架构
    javaScript事件(六)事件类型之滚轮事件
    你不是真正的快乐
  • 原文地址:https://www.cnblogs.com/liang24/p/13143426.html
Copyright © 2011-2022 走看看