java——数组
1,数组概述
- 数组是一组数据的集合
- 数组作为一种引用类型
- 数组元素的类型可以是基本类型,也可以是引用类型,但同一个数组只能是同一种类型
- 数组作为对象,数组中的元素作为对象的属性,除此之外数组还包括一个成员属性 length,length 表示数组的长度
- 数组的长度在数组对象创建后就确定了,就无法再修改了
- 数组元素是有下标的,下标从 0 开始,也就是第一个元素的下标为 0,依次类推最后一个元素的下标为 n-1,我们可以通过数组的下标来访问数组的元素
2,一维数组
一维数组的定义
- 格式一:数据类型[] 数组名;
- 格式二:数据类型 数组名[];
/**
* 数组的定义
*/
public class Demo01_Array {
/*
数组的定义:
格式一:数据类型[] 数组名;
格式二:数类型 数组名[];
*/
public static void main(String[] args) {
//1、数据类型[] 数组名;
int[] arr1; //定义一个int类型的数组,起名为arr1
//2、数据类型 数组名[];
float arr2[]; //定义一个float类型的数组,起名为arr2
}
}
一维数组的静态初始化
初始化:就是在内存中,为数组容器开辟空间,并将数据(元素)存放到容器中的过程
完整格式:数据类型 [ ] 数组名 = new 数据类型 [ ] {元素1,元素2,元素3,元素4....};
简化格式:数据类型 [ ] 数组名 = {元素1,元素2,元素3,元素4...};
/**
* 数组的静态初始化
*/
public class Demo02_Array {
/*
数组的静态初始化:
完整格式:数据类型[] 数组名 = new 数据类型[] {元素1,元素2,元素3,元素4...};
简化格式:数据类型[] 数组名 = {元素1,元素2,元素3,元素4...};
*/
public static void main(String[] args) {
//1、数据类型[] 数组名 = new 数据类型[] {元素1,元素2,元素3,元素4...};
//创建了一个int类型的数组,数组名叫做arr1,数组中存放了10,20,30,40,这四个元素
int[] arr1 = new int[]{10,20,30,40};
System.out.println(arr1);//打印输出数组在内存中的地址值
//2、数据类型[] 数组名 = {元素1,元素2,元素3,元素4...};
double[] arr2 = {2.55,3.55,4.55,5.55};
System.out.println(arr2);
//[I@1b6d3586: 表示int类型的数组在内存中的地址值 @符号之后的内容是十六进制的地址值
//[D@4554617c: 表示double类型的数组在内存中的地址值
}
}
一维数组动态初始化
- 动态初始化:初始化时只指定数组的长度,由系统为数组分配初始值
- 格式:数据类型 [ ] 数组名 = new 数据类型 [ 数组长度 ] ;
/**
* 数组的动态初始化
*/
public class Demo05_Array {
/*
数组的动态初始化:初始化时只能指定数组的长度,由系统未数组分配初始值
格式:数据类型[] 数组名 = new 数据类型[数组长度];
数据类型的默认初始值:
基本数据类型:
整数:0
浮点型:0.0
布尔:false
字符型:空白字符
引用数据类型:null
*/
public static void main(String[] args) {
//数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr = new int[4];
//获取数组的默认值
System.out.println(arr[0]);//0
System.out.println(arr[1]);//0
System.out.println(arr[2]);//0
System.out.println(arr[3]);//0
//赋值操作
arr[0] = 11;
arr[1] = 22;
arr[2] = 33;
arr[3] = 44;
//遍历数组,打印数据到控制台
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
数组初始化的区别和使用场景:
静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组长度。明确具体操作数据
动态初始化:手动指定数组长度,由系统默认初始化值。不明确具体数据,但明确数组长度
一维数组内存图
基本数据类型数据存储发生在栈内存中;引用类型数据存储,分两步,在堆中保存数据,在栈中保存数据的地址(堆地址)
3,二维数组
二维数组概述
二维数组:
是一种结构较为特殊的数组,只是将数组中的每个元素变成了一维数组
二维数组静态初始化
初始化格式:
数据类型 [ ] [ ] 数组名 = new 数组类型 [ ] [ ] {{元素1,元素2},{元素1,元素2}...};
简化格式:
数据类型 [ ] [ ] 数组名 = {{元素1,元素2},{元素1,元素2}...};
二维数组元素访问格式:
格式:数组名[索引] [索引] ;
/**
* 二维数组
*/
public class Demo01_Array {
/*
二维数组:
也是一种容器,容器中存储的是一维数组
格式:
初始化格式: 数据类型 [] [] 数组名 = new 数组类型 [] [] {{元素1,元素2},{元素1,元素2}...};
简化格式:数据类型 [] [] 数组名 = {{元素1,元素2},{元素1,元素2}...};
*/
public static void main(String[] args) {
//1、创建二维数组
int[][] arr = {{1,2,3},{10,20,30}};
//2、打印一维数组的地址值
System.out.println(arr[0]);//
//3、打印一维数组的中的元素
System.out.println(arr[0][1]);
}
}
二维数组动态初始化
格式:数据类型 [ ] [ ] 数组名 = new 数据类型 [ m ] [ n ];
m 表示当前二维数组中可以存放的一维数组个数,
n 表示每一个一维数组可以存放多少个元素
/**
* 二维数组的动态初始化
*/
public class Demo03_Array {
/*
格式:数据类型 [ ] [ ] 数组名 = new 数据类型 [ m ] [ n ];
m 表示当前二维数组中可以存放的一维数组个数,
n 表示每一个一维数组可以存放多少个元素
*/
public static void main(String[] args) {
//创建一个二维数组,其可以存放2个一维数组,每个一维数组可以存放3个元素
int[][] arr = new int[3][3];
//给一维数组赋值
arr[0] = new int[]{1, 2, 3};
arr[1] = new int[]{11, 22, 33};
//遍历二维数组,获取一维数组中的元素,并打印
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
System.out.println(Arrays.toString(arr[i]));
}
}
}
4,数组常用方法
1,数组求和
public class Demo08 {
/*
求数组的偶数之和
1、初始化数组
2、定义求和变量
3、遍历数组中每一个元素
4、判断元素是否为偶数,是偶数进行求和赋值运算
5、打印求和值
*/
public static void main(String[] args) {
//1、初始化数组
int[] arr = {22,33,44,55,66};
//2、定义求和变量
int sum = 0;
//3、遍历数组中每一个元素
for (int i = 0; i < arr.length; i++) {
//4、判断元素是否为偶数,是偶数进行求和赋值运算
if (arr[i]%2==0){
sum+=arr[i];
}
}
//5、打印求和值
System.out.println(sum);
}
}
2,数组求最大值
public class Demo09 {
/*
求数组中的最大值
1、定义数组
2、定义最大值变量max,并将数组中的第一个元素赋值给变量max
3、从索引1开始遍历数组,依次取出数组元素和max比较,
大于max则赋值给max,小于max则继续比较
4、输出打印数组中元素最大值
*/
public static void main(String[] args) {
int[] arr = {11,55,33,87,21};
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i]>max){
max = arr[i];
}
}
System.out.println(max);
}
}
3,二维数组遍历
/**
* 遍历二维数组
*/
public class Demo02_Array {
/*
遍历二维数组:先遍历出一个一个的一维数组,再将一维数组中存储的每个元素遍历出来
*/
public static void main(String[] args) {
int[][] arr = new int[][]{{111,222,333},{10,20,30},{100,200,300}};
//1、遍历二维数组,获取每一个一维数组
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
System.out.println(Arrays.toString(arr[i]));
}
}
}
5,数组常见问题
1,索引越界
/**
* 数组异常
*/
public class Demo06_ArrayEcxeption {
/*
数组索引越界异常:ArrayIndexOutOfBoundsException
即当访问数组中不存在的索引,引发的异常
*/
public static void main(String[] args) {
int[] arr1 = {11,22,33,44};
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println(arr1[5]);
}
}
2,空指针异常
/**
* 空指针异常:
*/
public class Demo07_ArrayEcxeption {
/*
空指针异常:
当引用数据类型被赋值为null之后,地址的消失,再继续访问堆内存数据,会引发空指针异常
*/
public static void main(String[] args) {
//创建数组
int[] arr1 = {10,20,30};
//引用变量arr1赋值为null
arr1 = null;
System.out.println(arr1[1]);
}
}
6,数组的排序和查找
冒泡排序,选择排序;二分法(折半法)查找
7,Arrays工具类
public class ArraysMethod01 {
public static void main(String[] args) {
//使用sort方法将数组按照默认规则排序(从小到大)
int[] arr = {112,3,4,56,67,1};
Arrays.sort(arr);
int[] arr = { 1, 2, 3, 4, 5 };
// 直接输出为内存地址[I@139a55
System.out.println(arr.toString());
//使用toString方法返回数组内容的字符串表示形式
System.out.println(Arrays.toString(arr));
//使用sort方法将数组按照定制规则排序
Integer array[] = {1, -1, 7, 0, 89};
Arrays.sort(arr, new Comparator(){
@Override
public int compare(Object o1, Object o2) {
Integer i1 = (Integer) o1;
Integer i2 = (Integer) o2;
return i2 - i1;
}
});
//输出排序后的数组中的内容
System.out.println(Arrays.toString(array));
//测试binarySearch方法
Integer[] arr = {1, 2, 90, 123, 567};
// 如果数组中不存在该元素,就返回 return -(low + 1);
int index = Arrays.binarySearch(arr, 567);
System.out.println("index=" + index);
//测试copyOf方法
Integer[] newArr = Arrays.copyOf(arr, arr.length);
System.out.println(Arrays.toString(newArr));
//测试fill方法
Integer[] num = new Integer[]{9,3,2};
//使用99去填充num数组,可以理解成是替换数组中原来所有的元素
Arrays.fill(num, 99);
System.out.println(Arrays.toString(num));
//测试equals方法
Integer[] arr2 = {1, 2, 90, 123};
//比较两个数组元素内容是否完全一致,一样返回true否则返回false
boolean equals = Arrays.equals(arr, arr2);
System.out.println("equals=" + equals);//false
//测试asList方法
//将一组值转成一个List集合,asList编译类型是List(接口)
List asList = Arrays.asList(2,3,4,5,6,1);
System.out.println("asList=" + asList);
// asList 运行类型 java.util.Arrays#ArrayList, 是Arrays类的静态内部类
System.out.println("asList的运行类型" + asList.getClass());
}
}