01

    科技2022-07-16  111

    Java数组

    1数组的概念

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

    数组的相关概念:

    数组名元素角标、下标、索引数组的长度:元素的个数

    数组的特点:

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

    数组的分类:

    按照维数:一维数组、二维数组按照数组元素的类型:基本数据类型元素的数组、引用数据类型的数组

    2 一维数组

    ①一维数组的声明和初始化

    int[] ids;//声明 //1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行 ids = new int[]{1001,1002,1003,1004}; //或者 int[] arr1 = new int[]{1001, 1002, 1003}; //1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行 String[] names = new String[5]; //赋值 names[0] = "王铭"; names[1] = "王赫"; names[2] = "张学良"; names[3] = "孙居龙"; names[4] = "王宏志";//charAt(0)

    ②数组的属性:length

    //属性:length System.out.println(names.length);//5 System.out.println(ids.length);

    数组一旦初始化,其长度就是确定的。

    数组长度一旦确定,就不可以修改。这是因为

    public class ArrayTest{ public static void main(String args[]){ int[] arr1 = new int[]{1, 2, 3};//静态初始化一个数组呢,他的长度就是有几个元素 String[] arr2 = new String[10];//动态初始化一个数组,他的长度一开始就定义好了。 } }

    ③一维数组元素的默认初始化值

    数组元素为整型:0数组元素为浮点型:0.0数组元素为字符型:0或\u0000,而非‘0’数组元素为boolean:false数组元素为引用数据类型:null

    ④一维数组的遍历

    for(int i = 0; i < names.length; i++){ System.out.println(names[i]); }

    ⑤一维数组的内存解析

    3 二维数组

    ①二维数组的概念

    对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。

    其实,从数组底层的运行机制来看,其实没有多维数组。

    ②二维数组的声明与初始化

    //1.二维数组的声明和初始化 int[] arr = new int[]{1,2,3};//一维数组 //静态初始化 int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}}; //动态初始化1 String[][] arr2 = new String[3][2]; //动态初始化2 String[][] arr3 = new String[3][];

    ③如何调用二维数组的指定位置的元素

    System.out.println(arr1[0][1]);//2 System.out.println(arr2[1][1]);//null System.out.println(arr2[0]);//[Ljava.lang.String;@1540e19d

    ④如何获取数组的长度

    System.out.println(arr4.length);//3 System.out.println(arr4[0].length);//3 System.out.println(arr4[1].length);//4

    ⑤如何遍历数组

    //4.如何遍历二维数组 for(int i = 0;i < arr4.length;i++){ for(int j = 0;j < arr4[i].length;j++){ System.out.print(arr4[i][j] + " "); } System.out.println(); }

    ⑥二维数组的内存解析

    4 数组常见算法

    ①数组的赋值与复制

    赋值

    array2 = array1;

    如何理解:将array1保存的数组的地址值赋给了array2,使得array1和array2共同指向堆空间中的同一个数组实体。

    复制

    如何理解:我们通过new的方式,给array2在堆空间中新开辟了数组的空间。将array1数组中的元素值一个一个的赋值到array2数组中。

    array2 = new int[array1.length]; for(int i = 0;i < array2.length;i++){ array2[i] = array1[i]; }

    ②数组元素的反转

    //方法一: // for(int i = 0;i < arr.length / 2;i++){ // String temp = arr[i]; // arr[i] = arr[arr.length - i -1]; // arr[arr.length - i -1] = temp; // } //方法二: // for(int i = 0,j = arr.length - 1;i < j;i++,j--){ // String temp = arr[i]; // arr[i] = arr[j]; // arr[j] = temp; // }

    ③数组元素的查找

    5.1 线性查找: 实现思路:通过遍历的方式,一个一个的数据进行比较、查找。 适用性:具有普遍适用性。

    int goal = 1; boolean flag = true; for (int i = 0; i < arr.length; i++) { //遍历整个数组,如果找到arr[i] = goal目标数字 if (goal == arr[i]){ System.out.println("找到了~"); flag = false; break; } } if (flag){ System.out.println("没有找到~"); }

    5.2 二分法查找: 实现思路:每次比较中间值,折半的方式检索。 适用性:(前提:数组必须有序)—> 二分查找

    //数组的查找-->二分查找 int goal = 98;//要查找的元素 int head = 0;//数组头索引 int end = arr.length-1;//数组尾索引 boolean flag = true;// while(head <= end){ int middle = (head + end) / 2; if(arr[middle] == goal){ System.out.println("找到了指定的元素:"+goal+",索引为:"+middle); flag = false; break; }else if(arr[middle] < goal){ //如果目标元素比,中间的元素大,那么head = middle + 1 head = middle + 1; }else{ //如果目标元素比中间的元素小,那么tail = middle - 1 end = middle - 1; } } if(flag){ System.out.println("没有找到了指定的元素"); }

    ④数组的排序算法

    冒泡排序

    public class Bubble{ public static void main(String args[]){ int[] arr = new int[]{43,32,76,-98,0,64,33,-21,32,99}; //外层循环是冒几个泡,一共几个元素就冒几个,也可以冒元素个数-1个(忽略第一个泡) for(int i = 0; i < arr.length - 1; i++){ //内层循环是比较两个元素,比较几次,执行一次外循环即冒出一个泡,长度就-1. 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; } } } } }

    选择排序

    public class SelectSort{ public static void main(String[] args){ int[] arr = new int[]{43,32,76,-98,0,64,33,-21,32,99}; for (int i = 0; i < arr.length - 1; i++) { int max = 0; int maxIndex = 0; //内层循环:遍历还没选出最大的数组长度,选出一个长度就-1。 for (int j = 0; j < arr.length - i; j++) { if (arr[j] > max){ max = arr[j]; maxIndex = j; } } //遍历完内层循环后,找到最大值,和最后一个元素交换。 int temp = arr[arr.length - 1 - i]; arr[arr.length - 1 - i] = max; arr[maxIndex] = temp; } } }

    快速排序

    5 Arrays工具类的使用

    1.理解: ① 定义在java.util包下。 ② Arrays:提供了很多操作数组的方法。 2.使用: //1.boolean equals(int[] a,int[] b):判断两个数组是否相等。 int[] arr1 = new int[]{1,2,3,4}; int[] arr2 = new int[]{1,3,2,4}; boolean isEquals = Arrays.equals(arr1, arr2); System.out.println(isEquals); //2.String toString(int[] a):输出数组信息。 System.out.println(Arrays.toString(arr1)); //3.void fill(int[] a,int val):将指定值填充到数组之中。 Arrays.fill(arr1,10); System.out.println(Arrays.toString(arr1)); //4.void sort(int[] a):对数组进行排序。 Arrays.sort(arr2); System.out.println(Arrays.toString(arr2)); //5.int binarySearch(int[] a,int key) int[] arr3 = new int[]{-98,-34,2,34,54,66,79,105,210,333}; int index = Arrays.binarySearch(arr3, 210); if(index >= 0){ System.out.println(index); }else{ System.out.println("未找到"); }

    6 数组常见异常

    1.数组角标越界异常:ArrayIndexOutOfBoundsException int[] arr = new int[]{1,2,3,4,5}; // for(int i = 0;i <= arr.length;i++){ // System.out.println(arr[i]); // } // System.out.println(arr[-2]); // System.out.println("hello"); 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()); 小知识:一旦程序出现异常,未处理时,就终止执行。

    7 练习题

    ①一维数组

    package com.atguigu.exer; import java.util.Scanner; /* * 2. 从键盘读入学生成绩,找出最高分,并输出学生成绩等级。 成绩>=最高分-10 等级为’A’ 成绩>=最高分-20 等级为’B’ 成绩>=最高分-30 等级为’C’ 其余 等级为’D’ 提示:先读入学生人数,根据人数创建int数组,存放学生成绩。 * */ public class ArrayDemo1 { public static void main(String[] args) { //1.使用Scanner,读取学生个数 Scanner scanner = new Scanner(System.in); System.out.println("请输入学生人数:"); int number = scanner.nextInt(); //2.创建数组,存储学生成绩:动态初始化 int[] scores = new int[number]; //3.给数组中的元素赋值 System.out.println("请输入" + number + "个学生成绩:"); int maxScore = 0; for(int i = 0;i < scores.length;i++){ scores[i] = scanner.nextInt(); //4.获取数组中的元素的最大值:最高分 if(maxScore < scores[i]){ maxScore = scores[i]; } } // for(int i = 0;i < scores.length;i++){ // if(maxScore < scores[i]){ // maxScore = scores[i]; // } // } //5.根据每个学生成绩与最高分的差值,得到每个学生的等级,并输出等级和成绩 char level; for(int i = 0;i < scores.length;i++){ if(maxScore - scores[i] <= 10){ level = 'A'; }else if(maxScore - scores[i] <= 20){ level = 'B'; }else if(maxScore - scores[i] <= 30){ level = 'C'; }else{ level = 'D'; } System.out.println("student " + i + " score is " + scores[i] + ",grade is " + level); } } }

    ②二维数组

    package com.atguigu.exer; public class ArrayDemo { public static void main(String[] args) { int[] arr = new int[] { 8, 2, 1, 0, 3 }; int[] index = new int[] { 2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3 }; String tel = ""; for (int i = 0; i < index.length; i++) { tel += arr[index[i]]; } System.out.println("联系方式:" + tel);//18... } }
    Processed: 0.008, SQL: 8