数据结构之数组

数组(Array)

  • 概念

  同一种类型数据的集合。其实数组就是一个容器。数组的本质就是堆内存中的一块连续的存储空间。

  

  • 定义

    动态初始化命名:数据类型 [ ] 数组名 = new 数据类型 [数组的长度]

int[] array = new int[5];

    

    静态初始化命名:数据类型 [ ] 数组名 = new 数据类型 [ ] {x,y,z,a,b,c...}(可省略写为:数据类型 [ ] 数组名 = {x,y,z,a,b,c...})

int [] array = new int[]{1,2,3,4,5};
//
int [] array = {1,2,3,4,5};

    

    定义了一组数组之后,系统为每个元素指定一个索引值,索引值是从0开始的

    数组名其实就是一个变量名,保存数组的引用(数组的起始地址),new 运算符会在堆内存中分配一块连续的空间,把这块连续的空间的引用保存到数组名中

 

  • 数组的扩容

   理论上来说,数组定义后就无法扩容了;但我们可以换个思路:定义一个更大的数组,把原来数组的内容复制到新的数组中,让数组名指向新的数组

  使用System.arrayCopy(src,srcPos,dest,destPos,length)方法:

int [] array = new int[]{1,2,3};
int [] newArray = new int[6];
System.arraycopy(array, 0, newArray, 0, array.length);
System.out.println(Arrays.toString(newArray));
//结果:[1, 2, 3, 0, 0, 0]

  解释一下各参数的含义:把src数组从srcPos开始的length个元素复制到dest数组的destPos位置

  还可以使用:Arrays.copyOf(原来的数组,新数组的长度)方法,为了证实数组引用指向的地址改变了,我打印了出来:

int [] array = new int[]{1,2,3};
System.out.println("扩容前的地址:"+ array.toString());
//扩容前的地址:[I@15db9742
array = Arrays.copyOf(array, 2*array.length);
//扩容后的地址:[I@6d06d69c
System.out.println("扩容后的地址:"+ array.toString());
System.out.println(Arrays.toString(array));
//结果:[1, 2, 3, 0, 0, 0]

  这也证实了,数组在定义后,是无法扩容的;想要进行扩容,就必须创建新的数组对象

  • 数组的遍历

  for循环遍历

int [] array = new int[]{1,2,3};
for(int i = 0;i < array.length;i++){
    System.out.println(array[i]);
}

   foreach循环:

    int [] array = new int[]{1,2,3};
        for (int i : array) {
            System.out.println(i);
        }
  • 数组的优缺点  

  优点:按照索引查询元素速度快 ;按照索引遍历数组方便;数组的大小固定后便无法扩容

  缺点:数组只能存储一种类型的数据 ,添加,删除的操作慢,因为要移动其他的元素。

  适用场景:频繁查询,对存储空间要求不大,很少增加和删除的情况

 

 

原文地址:https://www.cnblogs.com/javaisbest/p/12909631.html