数组
我们可以使用数组来保存同一个数据类型的多个数据
数组的特点
①数组的长度一旦确定就不能改变
②一个数组中元素的数据类型都是一样的
数组的初始化
动态初始化
格式
数据类型[] 数组名 = new 数据类型[长度];
例如:
int[] arr = new int[10];//动态初始化了一个长度为10的数组,数组元素为int类型
静态初始化
格式
标准格式:
数据类型[] 数组名 = new 数据类型[] {元素值1,元素值2,元素值3,…};
例如:
int[] arr = new int[]{1,2,3,4,5};
省略格式(推荐使用):
数据类型[] 数组名 = {元素值1,元素值2,元素值3,…};
例如:
int[] arr = {1,2,3,4,5};
总结
静态初始化和动态初始化都可以实现对数组的初始化,那么我们在需要创建数组的时候应该如何选择呢?
如果数组元素都确定好了,并且个数有限的情况下我们可以使用静态初始化,因为更方便。如果只能确定数组的长度,数组的元素值需要后面再赋值的话可以使用动态初始化。
数组元素的表示
格式
数组名[索引值]
例如:
int[] arr = {1,2,3,4};
//输出数组arr的第一个元素
System.out.println(arr[0]);
//把数组arr的第3个元素值修改为5
arr[2] = 5;
注意
索引值就是一个int数字,代表数组当中元素的编号。
索引值从0开始,一直到“数组的长度-1”为止。例如长度为5的数组他的索引范围为0到4
数组的内存结构
观察下面代码的输出结果
int[] arr = new int[5];
arr[0] = 1;
arr[1] = 2;
int[] arr2 = arr;
arr2[2] = 3;
arr2[3] = 4;
System.out.println(arr2[0]);
System.out.println(arr[3]);
如果想要弄明白上面代码的输出结果就需要知道一个数组在内存中是如何存储的。
实际上,数组的实体保存在堆中,数组名实际保存的是数组实体的地址值。
数组长度
在java中我们可以非常方便的获取到数组的长度,格式如下:
数组名.length
例如:
int[] arr = {1,2,3,4};
//输出数组长度
System.out.println(arr.length);
数组的遍历
我们在操作数组的时候很多时候需要对数组的每个元素挨个操作一遍,这种情况下我们就可以对数组进行遍历操作。
int[] arr={1,2,3,4,5,7};
//遍历输出数组元素
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
常见问题
1.观察下面程序的执行结果 ArrayIndexOutOfBoundsException 数组索引越界
int[] arr = new int[3];
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;
System.out.println(arr[2]);
练习题
1.数组的动态扩容并实现增删改查
package com.stx.p10.lianghong;
import java.util.Scanner;
/**
* @author : lianghong
* @version 1.0
* @date : 2023/9/20 9:16
* @description: TODO
*/
public class ArrayCrud {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//定义扫描器
int[] arr = {1, 2, 3};//给数组赋值
while (true) {
System.out.println("请选择:1.添加\t2.遍历\t3.删除\t4.修改\t0.退出");
String choose = sc.next();
if ("0".equals(choose)) {
System.out.println("BYE");
break;
}
switch (choose) {
case "1":
arr = add(arr, sc);
System.out.println("添加成功");
break;
case "2":
show(arr);
break;
case "3":
arr = remove(arr, sc);
System.out.println("删除成功");
break;
case "4":
update(arr, sc);
System.out.println("修改成功!");
break;
case "0":
System.out.println("退出");
break;
default:
System.out.println("输入错误!");
break;
}
}
}
/**
* 添加
*/
private static int[] add(int[] arr, Scanner sc) {
System.out.println("请输入要添加的数字:");
int num = sc.nextInt();
int[] copy = new int[arr.length + 1];//数组扩容,原数组上加1
System.arraycopy(arr, 0, copy, 0, arr.length);//把旧数组上面的数组拷贝到新数组上面
copy[arr.length ] = num;
return copy;
}
/**
* 删除
*/
private static int[] remove(int[] arr, Scanner sc) {
System.out.println("请输入要删除的数:");
int num = sc.nextInt();
int index = findNum(arr, num);
if (index == -1) {
System.err.println("该数字不存在..");
return arr;
}
int[] copy = new int[arr.length - 1];
for (int i = 0; i < index; i++) {
copy[i] = arr[i];
}
for (int i = index; i < copy.length; i++) {
if (index != (arr.length - 1)) {
copy[i] = arr[i + 1];
}
}
return copy;
}
/**
* 查询
*
* @param arr
*/
private static void show(int[] arr) {
for (int i : arr) {
System.out.print(i);
}
System.out.println();
}
/**
* 修改
*/
private static void update(int[] arr, Scanner sc) {
System.out.println("请输入你需要修改的数字:");
int num = sc.nextInt();
int i = findNum(arr, num);
System.out.println("请输入你修改之后的数字:");
int nexted = sc.nextInt();
arr[i] = nexted;
}
/**
* 查找
*/
public static int findNum(int[] arr, int num) {
for (int i = 0; i < arr.length; i++) {
if (num == arr[i]) {
return i;
}
}
return -1;
}
}