07
数组
1.基本概念
概念:
用来存储一组相同数据类型的集合(容器)
引用数据类型:类 接口 数组
特点:
- 数组中的元素类型必须一致
- 数组本身是引用数据类型,但是里面的元素既可以是基本数据类型,也可以是引用数据类型
- 数组的长度一旦给定便无法改变
声明:
//数据类型[] 数组名;
int[] arr;
//数据类型 数组名[];
String arr[];
main方法中 args 和 [] 位置可以更改
2.数组的动态初始化
- 给定数组的长度,有系统的分配空间和初始值。
格式:
//数据类型[] 数组名 = new 数据类型[长度];
int[] arr2 = new int[4];
数据的存取:
- 索引值:数组中元素的序号(从0开始,最大值是数组的长度减1)
- 赋值:
数组名[索引值] = 要赋的值
- 取值:
数组名[索引值];
public class Demo1 {
public static void main(String[] args) {
String arr[] = new String[4];
arr[0] = "春季";
arr[1] = "夏季";
arr[2] = "秋季";
arr[3] = "冬季";
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
char arr1[] = new char[4];
arr1[0] = '多';
arr1[1] = '易';
arr1[2] = '教';
arr1[3] = '育';
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
System.out.println(arr1[3]);
int arr2[] = new int[10];
for (int i = 0; i < 10; i++) {
arr2[i] = i + 1;
System.out.println(arr2[i]);
}
}
}
3.数组的内存分析
- 栈:存储局部变量,方法的执行,没有初始值
- 堆:new出来的东西,有初始值
- 基本类型:默认值
- 引用类型:null
如果堆中没有栈中的变量指向时,就会成为垃圾,等待GC自动回收
public class Demo2 {
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr);//打印数组在栈中的地址值
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
arr[1] = 100;
System.out.println(arr[1]);
}
}
public class Demo3 {
public static void main(String[] args) {
String[] arr1 = new String[5];
arr1[1] = "大";
System.out.println(arr1[1]);
String[] arr2 = new String[4];
arr2[1] = "小";
arr2 = arr1;//将arr1的地址值赋值给arr2
System.out.println(arr1[1]);//大
System.out.println(arr2[1]);//大
}
}
4.数组的静态初始化
- 给定数组中的元素,由系统根据数组元素的个数开辟空间并赋值
格式:
//数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3…}
char[] ch = new char[] { '春', '夏', '秋', '冬' };
//数据类型[] 数组名 = {元素1,元素2,元素3…}
boolean[] bool = { false, false, true, true };
第二种类型只有初始化时可以定义,重新赋值不可以这样写
获取数组的长度:
数组名.length
public class Dem4 {
public static void main(String[] args) {
char[] ch = new char[] {'春', '夏', '秋','冬' };
for (int i = 0; i < ch.length; i++) {
System.out.println(ch[i]);
}
boolean[] bool = { false, false, true, true };
for (int i = 0; i < bool.length; i++) {
System.out.println(bool[i]);
}
int[] num = { 4, 8, 8, 9, 5 };
int sum = 0;
double pingjun = 0;
for (int i = 0; i < num.length; i++) {
sum += num[i];
pingjun = (double)sum / num.length ;
}
System.out.println("五个数之和为:" + sum);
System.out.println("五个数的平均值为:" + pingjun);
}
}
5.数组中常见两种异常
- 空指针异常:java.lang.NullPointerException
- 数组角标越界异常:java.lang.ArrayIndexOutOfBoundsException
public class Demo5 {
public static void main(String[] args) {
int[] arr = null;
System.out.println(arr);//null
System.out.println(arr.length);//空指针异常
arr = new int[3];
System.out.println(arr[3]);//数组角标越界异常
}
}
6.数组案例
- 点名系统
import java.util.Random;
public class Demo6 {
public static void main(String[] args) {
//1.构建数组名字
String names[] = new String[] {"小红","小绿","小黑","小白","小粉","小黄","小蓝","小花"};
//2.生成随机数
Random random = new Random();
int index = random.nextInt(names.length);
//3.从数组中索引对应的元素
String name = names[index];
System.out.println(name);
}
}
- 数组工具类封装
import java.util.Scanner;
public class ArrayUtil {
// 此方法可以用于遍历int类型
// 需要传入一个int类型
public static void printArr(int[] arr) {
for (int i = 0; i < arr.length; i++) {
if (i == 0) {
System.out.print("[" + arr[i] + ",");
} else if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}
}
// 此方法可以用于遍历String类型
// 需要传入一个String类型
public static void printArr(String[] arr) {
for (int i = 0; i < arr.length; i++) {
if (i == 0) {
System.out.print("[" + arr[i] + ",");
} else if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}
}
// 数组中求最值的方法
// 需要传入一个int类型的数组
public static void getMaxAndMin(int[] arr) {
int max = arr[0];
int min = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max) {
max = arr[i];
}
if (arr[i] < min) {
min = arr[i];
}
}
System.out.println("数组中的最大值为:" + max);
System.out.println("数组中的最小值为:" + min);
}
//对数组中的任意元素进行位置交换
public static void changeElement(int[] arr) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入要交换元素的索引:");
System.out.println("请输入第一个元素的索引:");
int index1 = scanner.nextInt();
System.out.println("请输入第二个元素的索引:");
int index2 = scanner.nextInt();
if (!(index1 >= 0 && index1 <= arr.length - 1 && index2 >= 0 && index2 <= arr.length - 1)) {
System.out.println("输入的索引超出边界范围,请重新输入!");
return;
}
System.out.println("元素交换前:");
printArr(arr);
int temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
System.out.println();
System.out.println("元素交换后:");
printArr(arr);
}
//数组中元素进行倒序操作
//需要传入一个int类型的数组
public static void reverse(int[] arr) {
System.out.println("逆序前:");
printArr(arr);
for (int start = 0,end = arr.length-1;start < end; start++,end--) {
int temp = 0;
temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}
System.out.println();
System.out.println("逆序后:");
printArr(arr);
}
}
7.多维数组
- n维数组就是元素为n-1维数组的数组
- 给二维数组中的一组值赋值时不能简写
格式:
/*数据类型[][] 数组名 = new 数据类型[m][n];
*m:二维数组中一维数组的个数
*n:一维数组中的元素个数*/
int[][] arr = new int[5][4] ;
/*数据类型[][] 数组名 = new 数据类型[m][];
*m: 二维数组中一维数组的个数*/
int[][] arr1 = new int[3][];
/*数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}...};
简写: 数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}...};*/
int[][] arr2 = {{1,2,3,4,5,6},{7,8,9},{10,20,30}};
public class Demo7 {
public static void main(String[] args) {
int[][] arr = new int[5][4] ;
arr[1][1] = 5;
arr[4][3] = 10;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
int[][] arr1 = new int[3][];
arr1[0] = new int[] {1,2,3,4,5};
arr1[1] = new int[] {100,200,300};
arr1[2] = new int[] {66,88};
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.print(arr1[i][j]+" ");
}
System.out.println();
int[][] arr2 = {{1,2,3,4,5,6},{7,8,9},{10,20,30}};
arr[0][2] = 10;
for (int k = 0; k < arr2.length; k++) {
for (int l = 0; l < arr2[k].length; l++) {
System.out.print(arr2[k][l]);
}
System.out.println();
}
}
}
}