2021-07-26 尚硅谷_数组

1、数组的概念

数组是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。

特点:
1.数组是有序排列的。
2.数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型。
3.创建数组对象会在内存中开辟一整块连续的空间。
4.数组的长度一旦确定,就不能修改。

2、一维数组的使用

2.1 一维数组的声明和初始化
  • 静态初始化:数组的初始化和数组元素的赋值操作同时进行。
int[] ids = new int[]{1001, 1002, 1003, 1004};
  • 动态初始化:数组的初始化和数组元素的赋值操作分开进行。
String[] names = new String[5];
  • 也是正确的写法(不是标准的写法)
int ids[] = {1001, 1002, 1003, 1004};
int[] ids = {1001, 1002, 1003, 1004}; // 不加new,类型推断

总结:数组一旦初始化完成,其长度就确定了。

2.2 如何调用数组的指定位置的元素
names[0] = "姓名一";
names[1] = "姓名二";
names[2] = "姓名三";
names[3] = "姓名四";
names[4] = "姓名五";
2.3 如何获取数组的长度

属性:length

System.out.println(names.length); // 5
2.4 如何遍历数组
for (int i = 0; i < names.length; i++) {
  System.out.println(names[i]);
}
2.5 数组元素的默认初始化值
  • 数组元素是整型时,默认初始化值是0。·
int[] arr = new int[4];
for (int i = 0; i < arr.length; i++) {
  System.out.println(arr[i]); // 0 0 0 0
}
  • 数组元素是浮点型时,默认初始化值是0.0
float[] arr1 = new float[4];
for (int i = 0; i < arr1.length; i++) {
  System.out.println(arr1[i]); // 0.0
}
  • char类型,默认初始化值是ASSIC码为0对应的那个字符,为0'\u000',而非'0'
char[] arr2 = new char[4];
arr2[0] == 0; // true
  • 数组元素是boolean时,默认初始化值是false
  • 数组元素是引用数据类型时,默认初始化值是null
2.6 数组的内存解析

内存结构(JVM当中实现的),所以,不同的jdk当中,内存的结构也有所区别。以下讲解一个比较稳定的结构。

列举内存当中几个主要的结构:

  • 栈(stack):主要存放局部变量
  • 堆(heap):主要存放new出来的结构,如数组、对象。
  • 方法区,包含常量池,静态域(静态的一些变量),和一些类加载的信息。

3、二维数组的使用

3.1 二维数组的声明和初始化
  • 静态初始化:数组的初始化和数组元素的赋值操作同时进行。
int[][] arr = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
  • 动态初始化1:数组的初始化和数组元素的赋值操作分开进行。
String[][] arr1 = new String[3][2];
  • 动态初始化2:数组的初始化和数组元素的赋值操作分开进行。
String[][] arr1 = new String[3][];
  • 也是正确的写法(不是标准的写法)
int arr2[][] = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
int[] arr3[] = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
int[] arr4[] = {{1, 2, 3}, {4, 5}, {6, 7, 8}};

总结:数组一旦初始化完成,其长度就确定了。

3.2 如何调用数组的指定位置的元素
System.out.println(arr[0][0]);

String[][] arr1 = new String[3][];
// 报错
// System.out.println(arr1[0][0]);
3.3 如何获取数组的长度

属性:length

3.4 如何遍历二维数组
int[][] arr = new int[][]{{1, 2, 3}, {4, 5}, {6, 7, 8}};
for (int i = 0; i < arr.length; i++) {
  for (int j = 0; j < arr[i].length; j++) {
    System.out.println(arr[i][j]);
  }
}
3.5 数组元素的默认初始化值

规定:二维数组分为外层数组的元素,内层数组的元素。

int[][] arr = new int[4][3];
// 外层元素:arr[0], arr[1]等
// 内层元素:arr[0][0], arr[1][2]等
  • 针对初始化方式一,比如:int[][] arr = new int[4][3];
    外层元素的初始化值为:地址值。
    内层元素的初始化值为:与一维数组初始化情况相同。
  • 针对初始化方式二,比如:int[][] arr = new int[4][];
    外层元素的初始化值为:null
    内层元素的初始化值为:不能调用,否则报错。
3.6 二维数组的内存解析

4、练习

4.1 使用二维数组打印一个10行的杨辉三角
int [][] arr = new int[10][];
for (int i = 0; i < 10; i++) {
  arr[i] = new int[i + 1];
  arr[i][0] = arr[i][i] = 1;
  for (int j = 0; j <= i; j++) {
     if ( j == 0 || j == i) {
       System.out.print(1);
     }
     if (i > 1) {
       int num = arr[i - 1][j - 1] + arr[i - 1][j];
       System.out.print(num);
       arr[i][j] = num;
     }
  }
  System.out.println();
}

5、数组中涉及到的常见算法

5.1 数组元素的赋值(杨辉三角、回形数等)
5.2 求数值型数组中元素的最大值、最小值、平均数、总和等
5.3 数组的复制、反转、查找(线性查找、二分查找)
  • 线性查找——从前往后依次查找
5.4 数组元素的排序算法
  • 冒泡排序
int[] arr = new int[]{43, 32, 76, -98, 0, 64, 33, -21, 32, 99};
for(int i = 0; i < arr.length - 1; i++){
  for(int j=0; j< arr.length - 1 - i; j++){
    if (arr[j] > arr[j + 1]) {
        int temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
    }
  }
}

6、Arrays工具类的使用

java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。

  • boolean equals(int[] a, int[] b):判断两个数组是否相等。
int[] arr1 = new int[]{1, 2, 3, 4};
int[] arr2 = new int[]{1, 3, 2, 4};
// 比较每个位置上的元素是否都相等
Arrays.equals(arr1, arr2); // false
  • String toString(int[] a):输出数组信息。
Arrays.toString(arr1); // [1, 2, 3, 4] 字符串类型
  • void fill(int[] a, int val):将指定值填充到数组之中。
Arrays.fill(arr1, 10); // [10, 10, 10, 10]
  • void sort(int[] a):对数组进行排序。
Arrays.sort(arr2); // [1, 2, 3, 4]
  • int binarySearch(int[] a, int key):对排序后的数组进行二分法检索指定的值。
    说明:返回指定元素对应的下标;没有找到指定元素时,会返回一个负数。因此,可以根据返回值是否 >= 0来判断是否找到该元素。
int[] arr3 = new int[]{-98, -34, 2, 34, 54, 66, 79, 105, 210, 333};
int index = Arrays.binarySearch(arr3, 210); // 8

7、数组中常见的异常

  • 数组角标越界的异常:ArrayIndexOutOfBoundsExcetion
int[] arr = new int[]{1, 2, 3, 4};
System.out.println(arr[4]);
System.out.println(arr[-2]);
  • 空指针异常:NullPointerException
// 情况一:
int[] arr1 = new int[]{1, 2, 3};
arr1 = null;
System.out.println(arr1[0]);

// 情况二:
int[][] arr2 = new int[4][];
System.out.println(arr2[0][0]);

// 情况三:
String[] arr3 = new String[]{"AA", "BB", "CC"};
arr3[0] = null;
System.out.println(arr3[0].toString());

你可能感兴趣的:(2021-07-26 尚硅谷_数组)