Java数组总结
这里写目录标题
- 一、概念
- 二、几个相关的概念
- 三、数组的特点
- 四、复习:变量按照数据类型的分类
- 五、数组的分类
- 六、一维数组的使用(6个基本点)
- 七、数组元素的默认初始值的情况
- 八、一维数组的内存解析
- 九、二维数组
- 十、数组的常用算法
- 1、数组的最大值、最小值、总和、平均值
- 2、数组的扩容与缩容
- 3、数组的反转
- 十一、数组工具类Arrays的使用
- 十二、数组中常见的异常
一、概念
是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
简称:多个数据的组合
Java中的容器:数组、集合框架:在内存中对多个数据的存储。
二、几个相关的概念
数组名
数组的元素(即内部存储的多个元素)
数组的下标、角标、下角标、索引、index(即找到指定数组元素所使用的编号)
数组的长度(即数组容器中存储的元素的个数)
三、数组的特点
数组中的元素在内存中是依次紧密排列的,有序的。
数组,属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以引用数据类型。
一旦初始化完成,其长度就确定了,并且其长度不可更改。(因为内存原因)
四、复习:变量按照数据类型的分类
基本数据类型:byte \ short \ int \ long ;float \ double ;char \ boolean
引用数据类型:类、数组、接口、枚举、注解、记录
五、数组的分类
按照元素的类型:基本数据类型元素的数组;引用数据类型元素的数组
按照数组的维数来分:一维数组;二维数组;
六、一维数组的使用(6个基本点)
数组的声明和初始化
调用数组的指定元素
数组的属性:length,表示数组的长度
数组的遍历
数组元素的默认初始化值
一维数组的内存解析(难)
package com.atguigu;/*** package:com.atguigu** @Author jimmy-yan* @Create 2024/10/13 10:30*/
public class OneArrayTest {public static void main(String[] args) {//1、变量的声明和初始化int num1 = 10;int num2; //初始化num2 = 20; //赋值//todo 1.1 声明数组double[] prices;//todo 1.2 静态初始化:数组变量的初始化与数组元素的赋值同时进行prices = new double[]{20, 12, 34.5};//todo 数组的声明和初始化,动态初始化。String[] foods = new String[4];//其他方式int[] arr = {}; //类型推断//todo 2、数组元素的调用//通过角标的方式,获取数组的元素//角标从0 开始,到数组的长度-1结束System.out.println(prices[0]);//System.out.println(prices[4]); //ArrayIndexOutOfBoundsExceptionfoods[0] = "米";foods[1] = "面";foods[2] = "油";foods[3] = "肉";//foods[4]="菜"; //ArrayIndexOutOfBoundsException//todo 3、数组的长度:用来描述数组容器中容量的大小//使用length属性表示System.out.println(foods.length); //4System.out.println(prices.length); //3//todo 4、如何遍历数组for (int i = 0; i < foods.length; i++) {System.out.println(foods[i]);}}
}
七、数组元素的默认初始值的情况
整型数组元素的默认初始化值:0
浮点型数组元素的默认初始化值:0.0
字符型数组元素的默认初始化值:0(或理解为’\u0000’)
boolean型数组元素的默认初始化值:false
引用数据类型数组元素的默认初始化值:null
八、一维数组的内存解析
Java中的内存结构是如何划分的?(主要关心JvM的运行时内存环境)
将内存区域划分为5个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区。
与目前数组相关的内存结构: 比如: int[] arr = new int[]{1,2,3};
栈:用于存放方法中声明的变量。比如:arr
堆:用于存放数组的实体(即数组中的所有元素)。比如:1,2,3
九、二维数组
数组的声明和初始化
int[][] arr = new int[][]{{1, 2, 3}, {4, 5, 6}, {6, 7, 8}};
动态初始化1
int[][] arr1 = new int[3][3];
动态初始化2
int[][] arr2 = new int[3][];
package com.atguigu;/*** package:com.atguigu** @Author jimmy-yan* @Create 2024/10/13 18:56*/public class TwoArrayTest {public static void main(String[] args) {//1、数组的声明和初始化int[][] arr = new int[][]{{1, 2, 3}, {4, 5, 6}, {6, 7, 8}};//2、动态初始化1int[][] arr1 = new int[3][3];//2、动态初始化2int[][] arr2 = new int[3][];//3、数组元素的调用//针对arr来说,外层元素{1,2,3},{4,5,6},{6,7,8};内层元素1,2,3,4,5,6,6,7,8System.out.println(arr[0][1]); //2System.out.println(arr[0]); //[I@5594a1b5arr1[0][1] = 8;System.out.println(arr1[0][1]); //8System.out.println(arr1[0]); //[I@6a5fc7f7//数组的长度System.out.println(arr1.length); //3System.out.println(arr1[0].length); //3//数组遍历for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr.length; j++) {System.out.print(arr[i][j] + "\t");}System.out.println();}}
}
十、数组的常用算法
1、数组的最大值、最小值、总和、平均值
package com.atguigu;/*** package:com.atguigu** @Author jimmy-yan* @Create 2024/10/13 22:44*/
public class ArrayExer1 {public static void main(String[] args) {//1、动态创建数组int[] arr = new int[10];//2、通过循环给数组进行赋值for (int i = 0 ; i<arr.length;i++){arr[i] = (int)(Math.random()*(99-10+1))+10;}//3、求最大值int max = arr[0];for (int i=0;i<arr.length;i++){if (max<arr[i]){max=arr[i];}}System.out.println("最大值为:"+max);//4、求最小值int min = arr[0];for (int i=0;i<arr.length;i++){if (min>arr[i]){min=arr[i];}}System.out.println("最小值为:"+min);//5、求总和int sum = 0;for (int i=0;i<arr.length;i++){sum+=arr[i];}System.out.println("总和为:"+sum);//6、求平均值int avg=sum/arr.length;System.out.println("平均值为:"+avg);}
}
2、数组的扩容与缩容
package com.atguigu;/*** package:com.atguigu** @Author jimmy-yan* @Create 2024/10/13 23:30*/
public class ArrayExer2 {public static void main(String[] args) {int[] arr = new int[]{1, 2, 3, 4, 5};//todo 扩容1倍容量int[] newArr = new int[arr.length * 2];//将原有的数组中的元素复制到新的数组中for (int i = 0; i < arr.length; i++) {newArr[i] = arr[i];}//将10,20,3添加到新数组newArr[arr.length] = 10;newArr[arr.length + 1] = 20;newArr[arr.length + 2] = 30;//将新数组的地址赋值到旧数组arr = newArr;for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+"\t");}}
}
package com.atguigu;/*** package:com.atguigu** @Author jimmy-yan* @Create 2024/10/13 23:39*/
public class ArrayExer3 {public static void main(String[] args) {//todo 数组的缩容int [] arr = {1,2,3,4,5,6,7};int deleteIndex = 4;//不新建数组for(int i=deleteIndex;i<arr.length-1;i++){arr[i]=arr[i+1];}arr[arr.length-1]=0;for(int i=0;i<arr.length-1;i++){System.out.print(arr[i]+"\t");}}
}
3、数组的反转
package com.atguigu;/*** package:com.atguigu** @Author jimmy-yan* @Create 2024/10/13 23:18*/
public class ArrayReverse {public static void main(String[] args) {int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7};for (int i = 0; i < (arr.length) / 2; i++) {int temp = arr[i];arr[i] = arr[arr.length - 1 - i];arr[arr.length - 1 - i] = temp;}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + "\t");}}
}
十一、数组工具类Arrays的使用
equals:比较两个数组的元素是否依次相等
System.out.println(arr1 == arr2); 比较的是地址是否相等
int[] arr1 = new int[]{1, 2, 3, 4, 5};
int[] arr2 = new int[]{1, 2, 3, 4, 5};
System.out.println(arr1 == arr2); //比较的是地址 false
toString:输出数组的值
直接打印数组,则输出的是数组的地址
System.out.println(arr1); //[I@6a5fc7f7
int[] arr1 = new int[]{1, 2, 3, 4, 5};
System.out.println(arr1); //[I@6a5fc7f7
sort:排序
binarySearch:查找
- 只要返回的是负数就算没有找到
fill:填充
package com.atguigu;import java.util.Arrays;/*** package:com.atguigu** @Author jimmy-yan* @Create 2024/10/14 9:27*/
public class ArraysUtils {public static void main(String[] args) {//1、boolean equals(int[] a,int[] b):比较两个数组的元素是否依次相等int[] arr1 = new int[]{1, 2, 3, 4, 5};int[] arr2 = new int[]{1, 2, 3, 4, 5};System.out.println(arr1 == arr2); //比较的是地址 falseboolean isEquals = Arrays.equals(arr1, arr2);System.out.println(isEquals); //比较的是值 true//2、输出数组的值System.out.println(Arrays.toString(arr1)); //[1, 2, 3, 4, 5]//3、填充Arrays.fill(arr1, 10);System.out.println(Arrays.toString(arr1)); //[10, 10, 10, 10, 10]//4、排序int[] arr3 = new int[]{10, 5, 7, 3, 7};Arrays.sort(arr3);System.out.println(Arrays.toString(arr3));//5、查找,前提数组必须是有序的int[] arr4 = new int[]{2, 4, 5, 6, 7, 9};int index = Arrays.binarySearch(arr4, 5);System.out.println(index); //2int index1 = Arrays.binarySearch(arr4, 8);System.out.println(index1); //-6,只要返回的是负数就算没有找到}
}
十二、数组中常见的异常
数组角标越界异常:ArrayIndexOutOfBoundsException
空指针异常:NullPointerException
package com.atguigu;import java.util.Arrays;/*** package:com.atguigu** @Author jimmy-yan* @Create 2024/10/14 9:27*/
public class ArraysUtils {public static void main(String[] args) {//todo 数组角标越界异常:ArrayIndexOutOfBoundsExceptionint[] arr = new int[10];
// System.out.println(arr[10]); //ArrayIndexOutOfBoundsException
// System.out.println(arr[-1]); //todo ArrayIndexOutOfBoundsException python可以使用负索引//todo 空指针异常:NullPointerException//情况1:
// int[] arr5 = new int[10];
// arr1=null;
// System.out.println(arr1[0]); //NullPointerException}
}