一、概念
是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
简称:多个数据的组合
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]); //ArrayIndexOutOfBoundsException
foods[0] = "米";
foods[1] = "面";
foods[2] = "油";
foods[3] = "肉";
//foods[4]="菜"; //ArrayIndexOutOfBoundsException
//todo 3、数组的长度:用来描述数组容器中容量的大小
//使用length属性表示
System.out.println(foods.length); //4
System.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、动态初始化1
int[][] arr1 = new int[3][3];
//2、动态初始化2
int[][] arr2 = new int[3][];
//3、数组元素的调用
//针对arr来说,外层元素{1,2,3},{4,5,6},{6,7,8};内层元素1,2,3,4,5,6,6,7,8
System.out.println(arr[0][1]); //2
System.out.println(arr[0]); //[I@5594a1b5
arr1[0][1] = 8;
System.out.println(arr1[0][1]); //8
System.out.println(arr1[0]); //[I@6a5fc7f7
//数组的长度
System.out.println(arr1.length); //3
System.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); //比较的是地址 false
boolean 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); //2
int 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 数组角标越界异常:ArrayIndexOutOfBoundsException
int[] 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
}
}