2、数组

1、定义:

  数组是一个有限定长度、连续存储元素的数据结构,其中每个元素都有一个唯一的索引或位置标识符。所有元素必须是同一数据类型(在静态类型语言如Java中),可以是基本数据类型(如整数、浮点数、字符等)或对象引用。

int[] intArray = {1, 2, 3, 4, 5};
char[] charArray = {'你', '我', '他'};
String[] stringArray = {"你行", "我行", "他行"};

2、内存布局:

  数组中的元素在内存中按照其索引顺序连续存放,相邻元素之间没有空隙。这种连续存储特性使得可以通过简单的地址计算(索引乘以单个元素的大小)快速访问任意元素。

3、索引访问:

  数组支持随机访问,即通过索引值在常数时间内(O(1)复杂度)找到指定元素。例如,在Java中,使用array[index]就可以获取或修改位于索引为index处的元素。

    /**
     * 测试运行
     *
     * @param args
     */
    public static void main(String[] args) {
        char[] charArray = {'你', '我', '他'};
        char c = charArray[2];
        System.out.println("输出c:" + c);//输出c:他
    }

4、固定长度:

  数组在创建时就需要确定其容量,即能容纳多少个元素。一旦创建,这个容量通常是不可改变的。如果需要增加更多元素,则可能需要创建一个新的更大的数组,并将原有数据复制过去。

5、插入和删除操作:

  在数组中插入或删除元素通常效率较低。由于元素是连续存储的,插入新元素通常需要移动后续元素来腾出空间,时间复杂度为O(n)。同样,删除元素后也需要移动后面的所有元素以保持连续性。

6、遍历:

  数组非常适合于从头至尾进行线性遍历,通过循环或迭代器可以方便地访问数组中的每一个元素。

7、多维数组:

  除了单维数组外,还可以构建多维数组,如二维数组、三维数组等。它们实际上是数组的数组,可以看作是表格或矩阵的表示形式。

//二维数组案例
int[][] array = {
    {11, 12, 13, 14, 15},
    {21, 22, 23, 24, 25},
    {31, 32, 33, 34, 35},
};

8、应用场合:

  数组在很多场景下有广泛应用,尤其是在性能要求较高的场合,如排序算法(如快速排序、归并排序)、图形处理、数据库索引等领域,因其高效的随机访问能力而受到青睐。

9、与动态数据结构对比:

  相对于动态数据结构如链表、堆、哈希表等,数组的主要优势在于随机访问速度快,但劣势在于插入和删除操作效率低以及无法轻易调整大小。

10、总结

  数组作为一种简单且高效的数据结构,在满足特定条件(特别是当需要频繁且无序地访问元素时)的情况下具有显著的优势。然而,其固定大小和插入/删除操作的限制意味着在某些灵活度需求高的场景下,其他数据结构可能是更优的选择。

11、动态数组(增删改查)

  在Java中,ArrayList通过其内部维护的一个动态数组来实现增删改查操作。以下是具体说明:

  • 增加(Add):
      添加元素到末尾:调用add(E element)或add(int index, E element)方法时,如果当前数组已满(即元素数量等于数组容量),则会自动扩容。扩容通常按当前容量的1.5倍进行,并将所有现有元素复制到新的、更大的数组中,然后将新元素添加到合适的位置。
      插入元素:当使用索引指定位置插入元素时,需要移动此位置之后的所有元素向后一位,以腾出空位放置新元素。

  • 删除(Remove):
      删除指定元素:remove(Object o)方法遍历整个数组查找并移除第一个匹配的元素。找到后,同样需要移动后面的所有元素填补被移除元素留下的空位。
      删除指定索引处的元素:remove(int index)直接从给定索引处移除元素,同样后续元素都需要向前移动一位。

  • 修改(Update/Modify):
      修改元素:通过set(int index, E element)方法可以替换指定索引处的元素,这是对数组的直接访问和修改,时间复杂度为O(1)。

  • 查询(Get):
      查询元素:get(int index)返回指定索引处的元素,由于数组支持随机访问,所以获取任何位置的元素的时间复杂度都是O(1)。

  总体来说,ArrayList的增删操作在最坏情况下(比如频繁在中间位置插入或删除元素导致频繁扩容或元素大量移动)效率相对较低,因为涉及到元素的移动;而查询和修改操作由于基于数组的特性,具有较高的效率。

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值