3. 数组

数组的常见概念:数组名、下标、元素、数组长度

要点:

①数组本身是引用数据类型, 数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。

数组的长度一旦确定,就不能修改。

③数组名中引用的是创建数组对象时在内存中开辟的一整块连续空间的首地址。

④ 可以直接通过下标(或索引)的方式调用指定位置的元素(索引从0开始)

⑤数组的分类:
             按照维度:一维数组、二维数组、三维数组、…
             按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对 象数组)

一维数组

声明方式:

type name[] 或 type[] name;
注意:Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5];//非法

初始化:

1.动态初始化:

数组声明且为数组元素分配空间与赋值的操作分开进行

int arr[] = new int[3];//或 int[] arr = new int[3];
arr[0] = 3;
arr[1] = 9;
arr[2] = 8;
String同理

2.静态初始化:

在定义数组的同时就为数组元素分配空间并赋值

int arr[] = new int[]{ 3, 9, 8};
int[] arr1 = {3,9,8};
int arr2[] = {3,9,8};
有三种不同写法,String同理

每个数组都有一个属性length指明它的长度,例如:a.length 指明数组a的长度(元素个数)
数组一旦初始化,其长度是不可变的。

数组元素的默认初始化值:

80593e6d8542530c1f5ebd723ee76ad2.png

多维数组

初始化:

1.动态初始化:

格式1:int[][] arr = new int[3][2];
/*定义了名称为arr的二维数组 
二维数组中有3个一维数组 
每一个一维数组中有2个元素 
一维数组的名称分别为arr[0], arr[1], arr[2] 
给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;*/

格式2:int[][] arr = new int[3][];
/*二维数组中有3个一维数组。
每个一维数组都是默认初始化值null (注意:区别于格式1) 
可以对这个三个一维数组分别进行初始化
注:int[][]arr = new int[][3]; //非法*/

2.静态初始化:

int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}};
/*定义一个名称为arr的二维数组,二维数组中有三个一维数组 
每一个一维数组中具体元素也都已初始化 
第一个一维数组 arr[0] = {3,8,2}; 
第三个一维数组的长度表示方式:arr[2].length; 
Java中多维数组不必都是规则矩阵形式
注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。*/

补充写法:

int[] arr[] = new  int[][]{{1,2,3},{4,5},{6,7,8}};
int[] arr[] = {{1,2,3},{4,5},{6,7,8}};
int arr[][] = new  int[][]{{3,8,2},{2,7},{9,0,1,6}};
int a[][]=new int[3][];
虽然[][]的位置多变,最好还是按照标准写,只有静态初始化可以省new int[][];

数组元素的默认初始化值:

二维数组分为外层数组的元素,内层数组的元素
针对于初始化方式一:比如:int[][] arr = new int[4][3];

外层元素的初始化值为:地址值
内层元素的初始化值为:与一维数组初始化情况相同

针对于初始化方式二:比如:int[][] arr = new int[4][];

外层元素的初始化值为:null
内层元素的初始化值为:不能调用,否则报错。

数组中涉及到的常见算法:

  1. 数组元素的赋值(杨辉三角、回形数等)
int[] arr1,arr2;
arr1 = new int[]{2,3,5,7,11,13,17,19};
arr2 = array1;//只是将arr1中的地址赋值给arr2,都指向了堆空间的唯一的一个数组实体。修改arr2的元素,arr1也会改变
//数组的复制:
arr2 = new int[arr1.length];
for(int i = 0;i < arr2.length;i++){
    arr2[i] = arr1[i];
}
  1. 求数值型数组中元素的最大值、最小值、平均数、总和等

  2. 数组的复制、反转、查找(线性查找、二分法查找)

//二分法查找:要求此数组必须是有序的。
int[] arr = new int[]{-99, -54, -2, 0, 2, 33, 43, 256, 999};
boolean isFlag = true;
int number = 256;
int head = 0;//首索引位置
int end = arr.length - 1;//尾索引位置
while(head<=end){
    int middle=(head+end)/2;
    if(number==arr[middle]){
        System.out.println("找到了指定的元素,位置为:"+middle);
        isFlag=false;
        break;
    }else if(arr[middle]>number){
        end=middle-1;
    }else{//arr2[middle] < number
        head=middle+1;
    }
}
if(isFlag){
    System.out.println("未找到指定的元素");
}
  1. 数组元素的排序算法 :分为内部排序和外部排序

十大内部排序算法:

选择排序:直接选择排序、堆排序

交换排序:冒泡排序、快速排序

插入排序:直接插入排序、折半插入排序、Shell排序

归并排序

桶式排序

基数排序

冒泡排序: 比较相邻的元素。如果第一个比第二个大(升序),就交换。

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;
        }
    }

性能对比

4236849c23e859d70d8474029aa88fb8.png

Arrays工具类的使用

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

常用的指令:
372a101d3330dc956ed5846b630fb49f.png

数组使用中的常见异常(编译时,不报错)

数组脚标越界异常(ArrayIndexOutOfBoundsException)

  • 访问到了数组中的不存在的脚标时发生。

空指针异常(NullPointerException)

  • arr引用没有指向实体,却在操作实体中的元素时。
posted @ 2023-09-30 16:12  LemonPuer  阅读(61)  评论(0)    收藏  举报