1.数组的定义

1.1、静态初始化数组

  • 定义数组的时候直接给数组赋值
//完整格式
//数据类型[]  数组名 = new 数据类型[]{元素1,元素2 ,元素3… };
double[] scores = new double[]{89.9, 99.5, 59.5, 88.0};
int[] ages = new int[]{12, 24, 36};
//简化格式
//数据类型[] 数组名 = { 元素1,元素2 ,元素3,… };
int[] ages = {12, 24, 36};
  • 数组的基本原理

image-20220812161639153

【注意】:数组变量名中存储的数组在内存中的地址,数组是引用类型。

1.1.2、数组的访问

//数组名称[索引]
// 取值
System.out.println(arr[0]); 
// 赋值
arr[2] = 100;
System.out.println(arr[2]); // 100

数组的长度属性:length

//数组.length
System.out.println(arr.length);

1.1.3、数组的几个注意事项

  • "数据类型[] 数组名" 也可以写为 “数据类型 数组名[]
int[] ages = ...;   //大众写法
int ages[] = ...;
  • 什么类型的数组存放什么类型的数据,否则报错

  • 数组一旦定义出来,程序执行的过程中,长度、类型就已经是固定的。

1.2、动态初始化数组

  • 定义数组的时候只确定元素的类型和数组的长度,之后再存入具体数据
//动态初始化格式:
//数据类型[] 数组名 = new 数组类型[数组长度];
int[] arr = new int[10];

1.2.1、动态初始化数组的元素默认值

两种初始化的使用场景、注意说明:

  • 动态初始化:只指定数组长度,后期赋值,适合开始知道数据的数量,但是不确定元素值的适合。
  • 静态初始化:开始就存入元素值,适合一开始就能确定元素值的适合。
  • 两种格式的写法是独立的,不可以混用。

2.数组的遍历

  • 一个一个数据的访问
int[] ages = {20, 30, 40, 50};
for (int i = 0; i < ages.length; i++) {                                
    System.out.println(ages[i]);
}

3.数组案例

3.1、数组元素求和

需求:某部门 5 名员工的销售额分别是:16、26、36、6、100,请计算出他们部门的总销售额度。

int[] soles = {16,26,36,6,100};
int sumSole = 0;
for (int i = 0; i < soles.length; i++) {
    sumSole += soles[i];
}
System.out.println("总销售额为:"+sumSole);

3.2、数组元素求最大值

int[] apperances = {15,9000,10000,20000,9500,-5};
int max = apperances[0];
for (int i = 1; i < apperances.length; i++) {
    max = max < apperances[i] ? apperances[i] : max;
}
System.out.println("最大值为:"+max);

3.3、猜数字游戏

需求:游戏后台随机生成1-20之间的5个数字(无所谓重复),然后猜数字

  • 未猜中提示:”没有猜中,请继续“
  • 猜中提示:”猜中了",并输出该数据第一次出现的索引位置,最后吧数组中的5个数据都输出看是否猜中。结束游戏。
Random random = new Random();
Scanner input = new Scanner(System.in);
int[] randomNumbers = new int[5];
for (int i = 0; i < randomNumbers.length; i++) {
    randomNumbers[i] = random.nextInt(20)+1;
}
OUT:
while(true){
    System.out.println("请出入猜测的数字:");
    int guessNumber = input.nextInt();
    for (int i = 0; i < randomNumbers.length; i++) {
        if(guessNumber==randomNumbers[i]){
        System.out.println("恭喜猜对!,该数字的索引为:"+i);
                    break OUT;
         }
     }
     System.out.println("没有猜中,请继续");
}
for (int i = 0; i < randomNumbers.length; i++) {
    System.out.println(randomNumbers[i]);
}

3.4、随机排名

需求:某供词开发部 5 名开发人员,要进行项目进展汇报,现在采取随机排名后进行汇报。请先一次录入 5 名开发人员的工号,然后展示出一组随机的排名顺序。

public class Test10 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int[] staffNumbers = new int[5];
        for (int i = 0; i < staffNumbers.length; i++) {
            System.out.println("请出入第"+(i+1)+"名员工的工号");
            staffNumbers[i] = input.nextInt();
        }
        Random random = new Random();
        for (int i = 0; i < staffNumbers.length; i++) {
            int randomIndex = random.nextInt(staffNumbers.length);
            int temporary = staffNumbers[randomIndex];
            staffNumbers[randomIndex] = staffNumbers[i];
            staffNumbers[i] = temporary;
        }
        for (int i = 0; i < staffNumbers.length; i++) {
            System.out.print(staffNumbers[i]+"\t");
        }
    }
}

4.数组的内存图

4.1、Java内存分配、数组内存图

  • 方法区

  • 栈内存

  • 堆内存

4.2、两个变量指向同一个数组

5.数组使用的常见问题

  • 问题1:如果访问的元素位置超过最大索引,执行时会出现 "ArrayIndexOutofBoundsException"(数组索引越界异常)
  • 问题2:如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现"NullPointerExcpetion"(空指针异常);

results matching ""

    No results matching ""