1、数组的概念

  • 数组(Array),是多个相同类型数据按一定顺序排序的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
  • 常见概念
    • 数组名
    • 下标(索引)``
    • 元素
    • 数组的长度
  • 数组本身是引用数组类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据 类型
  • 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。
  • 数组的长度一旦确定,就不能修改。
  • 我们可以通过下标(索引)的方式调用指定位置的元素,速度很快。
  • 数组的分类

    • 维度:一维数组,二维数组,三维数组
    • 数据类型:基本数据类型的数组,引用数据类型的数组(对象数组)

      2、一维数组的使用

  • 一维数组的声明方式:

    • type var[] type[] var
  • java语言中声明数组时不能指定长度(数组中元素的数),例如:int a[5] // 非法
  • 数组的初始化
    • 动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行

int[] arr = new int[3];
arr[0] = 3;

  • 静态初始化:在定义数据的同时就为数据元素分配空间并赋值

int[] arr = new int[]{1,2,3}
String[] names = {'1','2','3'}

  • 数组元素的引用
    • 引用方式:数组名[数组元素下标]
    • 每个数组都有一个长度的属性 length
    • 数组一旦初始化,长度不可变
  • 数组元素的默认初始化值

    • 数组是引用类型,元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式隐式初始化。
    • 对于基本数据类型而言,默认初始值各有不同
    • 对于引用数据类型而言,默认初始化值为null(与0不同)
      1. int[] a = new int[3];
      2. System.out.println(a[3]); // 默认值为0
      image.png
      image.png
      image.png
  • 内存的简化结构

image.png

  • 思考

定义一个数组类型的局部变量,他会存储在栈内存中,当我们new一个对象或者数组出来,数据会存储在堆内存中,赋值的操作就是通过栈中的节点去找到堆中的数据??

3、多维数组的使用

  • Java语言中提供了支持多维数组的语法
  • 如果是一维数组是线性关系的话,那么二维数组可以看作一个表格。
  • 对于二维数组的理解,我们可以看作array1作为array2中的一个元素存在,其实从底层的运行机制来看并没有多维数组
  • 二维数组的初始化
    • 动态初始化1

int[][] arr = new int[3][2]

  • 动态初始化2

    1. int[][] arr = new int[3][];
    2. // 每个一维数组都是默认初始化值null
    3. arr[0] = new int[3];
    4. arr[1] = new int[2];
    5. arr[2] = new int[4];

    注意:int[][] arr = new int[][3];//非法

  • 静态初始化

    1. int[][] arr = new int[][]{{3,3},{2,1},{3,6,8}}
  • 特殊写法 (矩阵写法)

int[] x,y[]; x是一维数组,y是二维数组

练习;
获取数组中所有元素的和;

  1. public static void main(String[] args) {
  2. int[][] arr = new int[2][];
  3. arr[0] = new int[2];
  4. arr[0][0] = 2;
  5. arr[0][1] = 2;
  6. arr[1] = new int[2];
  7. arr[1][0] = 2;
  8. arr[1][1] = 2;
  9. int sum = 0;
  10. for (int[] x:arr){
  11. for (int y:x){
  12. System.out.print(y+",");
  13. sum+=y;
  14. }
  15. System.out.println();
  16. }
  17. System.out.println("和为"+sum);
  18. }

二维数组的打印杨辉三角

  1. // 后续进行手打

4、数组中涉及的常见算法

  1. 数组元素的赋值(杨辉三角,回型数等)
  2. 求数值型数组元素的最大值,最小值,平均数,总和等
  3. 数组的反转,复制,查找(线性查找,二分法查找)
  4. 数组元素的排序算法
    1. 内部排序:所有排序都在内存中完成
    2. 外部排序:由多次内部排序完成

4.1 十大内部排序

  • 选择排序
    • 直接选择排序,堆排序
  • 交换排序
    • 冒泡排序,快速排序
  • 插入排序
    • 直接插入排序,折半插入排序,shell排序
  • 归并排序
  • 桶式排序
  • 基数排序

    5、Arrays工具类的使用

  • 操作数组的工具类,(排序,搜索)的各种方法 | boolean equals(a,b) | 判断两个数组是否相等 | | —- | —- | | String toString(a ) | 输出数组信息 | | void fill(a,int val) | 将指定值填充到数组之中 | | void sort(a) | 对数组进行排序 | | int binarySerach(a,int key) | 对排序后的数组进行二分法检索指定的值 |

6、数组使用中的常见异常

  • 数组脚标越界异常(ArrayLindexOutOfBoundsException)
    • 访问到了数组中不存在的脚标时发生的异常
  • 空指针异常(NUllPointerException)
    • arr引用没有指向实体,却操作实体中的元素时的异常