一、数组的概述
1.定义
多个相同数据类型的数据按照一定的顺序排列的集合,使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
2.特点
①数组是有序排列的;
②数组本身是引用数据类型,数组中的元素既可以是基本数据类型,也可以是引用数据类型;
③创建数组会在内存中开辟一整块连续的空间,而数组通过数组名引用的是这块连续空间的首地址;
④数组一旦初始化完成,其长度就确定了;数组的长度一旦确定,就不能修改;
⑤通过索引来访问数组中的元素,速度很快
3.分类
按照维数:一维数组、二维数组、多维数组
按照数组中元素的类型:基本数据类型元素的数组、引用数据类型元素的数组
二、一维数组
1.一维数组的声明和初始化
public class test { public static void main(String[] args) { //数组的声明 int[] arr1; String arr2[]; //数组的静态初始化 arr1 = new int[]{1, 2, 3}; //数组的动态初始化 arr2 = new String[4]; //声明+初始化 int[] arr3 = new int[3]; //类型推断 String[] arr4 = {"str1", "str2", "str3"}; } }
2.访问一维数组中的元素
public class test { public static void main(String[] args) { int[] arr = new int[]{1, 2, 3, 4, 5}; //访问数组中的元素:索引访问 System.out.println(arr[2]);//3 } }
3.一维数组的长度
public class test { public static void main(String[] args) { int[] arr = new int[]{1, 2, 3, 4, 5}; //数组的长度:调用数组对象的length属性 System.out.println(arr.length);//5 } }
4.一维数组的遍历
public class test { public static void main(String[] args) { int[] arr = new int[]{1, 2, 3, 4, 5}; //数组的遍历:循环 for (int i = 0;i < arr.length;i++){ System.out.println(arr[i]); } } }
5.一维数组的默认初始化值
public class test { public static void main(String[] args) { //一维数组的默认初始化值 //整形 byte[] arr1 = new byte[3]; short[] arr2 = new short[3]; int[] arr3 = new int[3]; long[] arr4 = new long[3]; System.out.println(arr1[1]);//0 System.out.println(arr2[1]);//0 System.out.println(arr3[1]);//0 System.out.println(arr4[1]);//0 //浮点型 float[] arr5 = new float[3]; double[] arr6 = new double[3]; System.out.println(arr5[2]);//0.0 System.out.println(arr6[2]);//0.0 //字符型 char[] arr7 = new char[3]; if (arr7[0] == '\u0000'){ System.out.println("hello!");//hello! } //boolean型 boolean[] arr8 = new boolean[3]; System.out.println(arr8[1]);//false //引用数据类型 String[] arr9 = new String[3]; System.out.println(arr9[0]);//null } }
6.一维数组的内存解析
三、二维数组
1.二维数组的声明和初始化
public class test { public static void main(String[] args) { //静态初始化 String[][] arr1 = new String[][]{{"张三", "李四"}, {"小明", "小花", "小王"}}; //动态初始化1 int[][] arr2 = new int[3][2]; //动态初始化2 int[][] arr3 = new int[3][]; //类型推断 int[][] arr4 = {{1, 2}, {1, 2, 5}}; } }
2.访问二维数组中的元素
public class test { public static void main(String[] args) { //访问二维数组的元素 String[][] arr1 = new String[][]{{"张三", "李四"}, {"小明", "小花", "小王"}}; int[][] arr2 = new int[3][2]; int[][] arr3 = new int[3][]; System.out.println(arr1[0][1]);//李四 System.out.println(arr2[2][1]);//0 System.out.println(arr3[1]);//null // System.out.println(arr3[0][1]);//报异常:NullPointerException } }
3.二维数组的长度
public class test { public static void main(String[] args) { //二维数组的长度 String[][] arr1 = new String[][]{{"张三", "李四"}, {"小明", "小花", "小王"}}; System.out.println(arr1.length);//2 System.out.println(arr1[1].length);//3 } }
4.遍历二维数组
public class test { public static void main(String[] args) { //二维数组的遍历 String[][] arr1 = new String[][]{{"张三", "李四"}, {"小明", "小花", "小王"}}; for (int i = 0; i < arr1.length; i++) { for (int j = 0; j < arr1[i].length; j++) { System.out.println(arr1[i][j]); } } } }
5.二维数组的默认初始化值
public class test { public static void main(String[] args) { //二维数组的默认初始化值 //方式一: int[][] arr1 = new int[3][2]; /* 外层元素:地址值 内层元素:跟一维数组的初始化情况相同 */ System.out.println(arr1[0]);//[I@4e50df2e System.out.println(arr1[0][1]);//0 //方式二: int[][] arr2 = new int[3][]; /* 外层元素:null 内层元素:不存在,无从谈起;强行调用,报错 */ System.out.println(arr2[1]);//null // System.out.println(arr2[1][0]);//NullPointerException } }
6.二维数组的内存解析
四、数组中的常见算法
1.数组元素的赋值
打印10行的“杨辉三角”:
public class test { public static void main(String[] args) { //1.声明并初始化二维数组 int[][] yangHui = new int[10][]; //2.给数组的元素赋值 for(int i = 0;i < yangHui.length;i++){ yangHui[i] = new int[i + 1]; //2.1 给首末元素赋值 yangHui[i][0] = yangHui[i][i] = 1; //2.2 给每行的非首末元素赋值 for(int j = 1;j < yangHui[i].length - 1;j++){ yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j]; } } //3.遍历二维数组 for(int i = 0;i < yangHui.length;i++){ for(int j = 0;j < yangHui[i].length;j++){ System.out.print(yangHui[i][j] + " "); } System.out.println(); } } }
2.数值型的数组求最大值、最小值、总和、平均值
public class test { public static void main(String[] args) { //定义一个整形数组,数组中有10个元素,且每一个元素都是随机的两位数 int[] arr = new int[10]; int num; for (int i = 0; i < arr.length; i++) { num = (int)(Math.random() * (99 - 10 + 1) + 10); arr[i] = num; } //遍历数组中的元素 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } //求最大值 int max = arr[0]; for (int i = 0; i < arr.length; i++) { if (max < arr[i]){ max = arr[i]; } } System.out.println("最大值为:" + max);//最大值为:93 //求最小值 int min = arr[0]; for (int i = 0; i < arr.length; i++) { if (min > arr[i]){ min = arr[i]; } } System.out.println("最小值为:" + min);//最小值为:10 //求总和 int sum = 0; for (int i = 0; i < arr.length; i++) { sum += arr[i]; } System.out.println("总和为:" + sum);//总和为:597 //求平均值 int avg = sum / arr.length; System.out.println("平均值为:" + avg);//平均值为:49 } }
3.数组的赋值和复制
数组的赋值:
将数组1的地址值赋给数组2,使得数组1和数组2同时指向了堆空间中的同一个对象实体。
数组的复制:
完全copy一份,相当于堆空间中创建一个新的对象实体。
public class test { public static void main(String[] args) { //数组的复制 int[] arr1 = new int[]{1, 2, 5, 6}; int[] arr2 = new int[arr1.length]; for (int i = 0; i < arr1.length; i++) { arr2[i] = arr1[i]; System.out.println(arr2[i]); } } }
4.数组的反转
public class test { public static void main(String[] args) { //数组的反转 int[] arr = new int[]{2, 5, 8, 3}; for (int i = 0; i < arr.length / 2; i++) { int temp = arr[i]; arr[i] = arr[arr.length - i - 1]; arr[arr.length - i - 1] = temp; } //遍历数组 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } }
5.二分法查找
public class test { public static void main(String[] args) { //二分法查找 int[] arr = new int[]{-98,-34,2,34,54,66,79,105,210,333}; int dest = 79; int start = 0; int end = arr.length - 1; boolean isFlag = true; while (start <= end){ int middle = (start + end) / 2; if (dest == arr[middle]){ System.out.println("找到了数组中的元素, 其索引为:" + middle); isFlag = false; break; }else if (dest < arr[middle]){ end = middle - 1; }else { start = middle + 1; } } if (isFlag){ System.out.println("很遗憾,没有找到指定元素"); } } }
6.十大排序算符
手写冒泡排序:
public class test { 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++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]){ int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } //遍历数组 for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + "\t");//-98 -21 0 32 32 33 43 64 76 99 } } }
五、Arrays工具类的使用
1.理解:
①属于java.util包下的工具类;
②里面定义了许多操作数组的方法;
2.使用
public class test { public static void main(String[] args) { //Arrays工具类的使用 int[] arr1 = new int[]{1, 2, 3, 4}; int[] arr2 = new int[]{1, 2, 3, 4}; //equals:判断两个数组是否相等 boolean equals = Arrays.equals(arr1, arr2); System.out.println(equals);//true //toString:输出数组信息 System.out.println(Arrays.toString(arr1));//[1, 2, 3, 4] //fill:将指定值填充到数组中 Arrays.fill(arr2, 10); System.out.println(Arrays.toString(arr2));//[10, 10, 10, 10] //sort:对数组进行排序 int[] arr = new int[]{2, 5, 8, 1, 28, 23}; Arrays.sort(arr); System.out.println(Arrays.toString(arr));//[1, 2, 5, 8, 23, 28] //binarySearch:查找数组中的元素,并返回索引 int dest = 28; int index = Arrays.binarySearch(arr, dest); if (index >= 0) { System.out.println(index);//5 }else { System.out.println("未找到"); } } }
六、数组中的常见异常
1.数组角标越界:ArrayIndexOutOfBoundsException
public class test { public static void main(String[] args) { int[] arr = new int[3]; // System.out.println(arr[3]);//ArrayIndexOutOfBoundsException } }
2.空指针异常:NullPointerException
public class test { public static void main(String[] args) { int[] arr = new int[3]; // //情况一: // arr = null; // System.out.println(arr[0]);//NullPointerException //情况二: int[][] arr1 = new int[3][]; System.out.println(arr1[1][0]);//NullPointerException } }
作者:Java之美
日期:2020-03-28
来源:https://www.cnblogs.com/897463196-a/p/12587695.html