第五章 Java数组(知识点与企业真题)

一、知识点

1.数组的概述

  • 数组,就可以理解为多个数据的组合。
  • 是程序中的容器:数组、集合框架(第12章,List、Set、Map)。
  • 数组存储的数据的特点:依次紧密排列的、有序的、可以重复的。
  • 此时的数组、集合框架都是在内存中对多个数据的存储。
  • 数组的其它特点:一旦初始化,其长度就是确定的、不可更改的。

基本语法的知识点:

1. 数组的理解(Array)

概念:是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。

简称:地多个数据的组合

Java中的容器:数组、集合框架(第12章)。在内存中对多个数据的存储。

2.几个相关的概念
> 数据名
> 数组的元素(既内部存储的多个元素)
> 数组的下标、角标、小角标、索引、index(即找到指定数组元素所使用的编号)
> 数组的长度(既数组容器中存储的元素的个数)

3.数组的特点:
> 数组中的元素在内存中是依次紧密排列的,有序的。
> 数组,属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型。
> 数组,一旦初始化完成,共长度就确定了,并且长度不可更改。
> 创建数组对象会扎起内存中开辟一整块‘连续的空间’。占据的空间的大小,取决于数组的长度和数组中元素的类型。

4. 复习:变量按章数据类型的分类
4.1 基本数据类型: byte \ short \ int \ long \ char \ boolean \ float \ double
4.2 引用数据类型: 类、数组、接口、枚举、注解、记录

5. 数组的分类
5.1 按照元素的类型:基本数类型元素的数组,引用数据类型元素的数组
5.2 按照元素的维数来分:一维数组,二维数组,...

6. 一维数组的使用(6个基本点)
> 数组的声明和初始化
> 调用数组的指定元素
> 数组的属性:length,表示数组的长度
> 数组的遍历
> 数组元素的默认初始化值
> 一维数组的内存解析(难)

7. 数组元素的默认初始化值的情况
注意:以数组的动态初始化方式为例说明。

> 整型数组元素的默认初始化值:0
> 浮点型数组元素的默认初始化值:0.0
> 字符型数组元素的默认初始化值:0 (或理解为'\u0000')
> boolean型数组元素的默认初始化值:false
> 引用数据类型数组元素的默认初始化值:null

8. 一维数组的内存解析
8.1 Java中的内存结构是如何划分的?(主要关心JVM的运行时内存环境)
> 将内存区域划分为5个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区

> 与目前数组相关的内存结构:   比如:int[] arr = new int[]{1,2,3};
    > 虚拟机栈:用于存放方法中声明的变量。比如:arr
    > 堆:用于存放数组的实体(即数组中的所有元素)。比如:1,2,3

8.2 举例:具体一维数组的代码的内存解析

基本语法的代码1:

package com.atguigu1.one;

/**
 * ClassName: OneArraryTest
 * Package: com.atguigu1.one
 * Description: 一维数组的基本使用
 *
 * @Author 随心油条
 * @Create 2024/1/25 9:52
 * @Version 1.0
 */
public class OneArraryTest {
    public static void main(String[] args) {
//        1. 数组的声明与初始化
//        复习:变量的定义格式:数据类型 变量名 = 变量值
        int num1 = 10;
        int num2; //声明
        num2 = 20; //初始化

//        1.1 声明数组
        double[] prices;
//        1.2 数组的初始化
//        静态初始化:数组变量的赋值与数组元素的赋值操作同时进行。
        prices = new double[]{20.32,43.21,43.22};
//        这里不能使用
//        princes = {20.32,43.21,43.22};

//        String[] foods;
//        foods = new String[]{"拌海蜇","龙须菜","炝冬笋","玉兰片"};

//        数组的声明和初始化
//        动态初始化:数组变量的赋值与数组元素的赋值操作分开进行。
        String[] foods = new String[4];

//        其他正确的方式
        int arr[] = new int[4];
        int[] arr1 = new int[]{1,2,3,4};

//        错误的方式
//        int[] arr2 = new int[4]{1,2,3,4};//既有动态,又有静态 报错的原因为:同时使用维表达式和初始化创建数组是非法的
//        int[3] arr3 = new int[]; //声明数组元素个数只能从后面的[]中声明

//        2.数组元素的调用
//        通过角标的方式,获取数组的元素
//        角标的范围从0开始,到数组的长度-1结束
        System.out.println(prices[0]);
        System.out.println(prices[2]);
//        System.out.println(prices[4]);//异常:ArrayIndexOutOfBoundsException

        foods[0] = "拌海蜇";
        foods[1] = "龙须菜";
        foods[2] = "炝冬笋";
        foods[3] = "玉兰片";
//        foods[4] = "酱茄子";//异常:ArrayIndexOutOfBoundsException

//        3.数组的长度:用来描述数组容器中容量的大小
//        使用length属性表示
        System.out.println(foods.length);//4
        System.out.println(prices.length);//3

//        4.如何遍历数组
//        System.out.println(foods[0]);
//        System.out.println(foods[1]);
//        System.out.println(foods[2]);
//        System.out.println(foods[3]);

        for (int i = 0; i < foods.length; i++){
            System.out.println(foods[i]);
        }
    }
}

基本语法的代码2:

package com.atguigu1.one;

/**
 * ClassName: OneArraryTest1
 * Package: com.atguigu1.one
 * Description: 一维数组的基本使用(承接OneArrayTest.java)
 *
 * @Author 随心油条
 * @Create 2024/1/25 10:47
 * @Version 1.0
 */
public class OneArraryTest1 {
    public static void main(String[] args) {

        //5. 数组元素的默认初始化值
//        整形数组元素的默认初始化值:0
        int[] arr1 = new int[3];
        System.out.println(arr1[0]);//输出为0


//        整形数组元素的默认初始化值:0
        short[] arry2 = new short[2];
        for (int i = 0; i < arry2.length; i++) {
            System.out.println(arry2[i]); //输出0
        }

//        浮点型数组元素的默认初始化值:0.0
        double[] arry3 = new double[4];
        System.out.println(arry3[1]); //输出0.0

//        字符型数组元素的默认初始化值:0 (或理解为'\u0000')
        char[] arry4 = new char[2];
        System.out.println(arry4[1]);
        if (arry4[1] == 0){
            System.out.println("aaaa");  //输出aaaa
        }
        if (arry4[1] == '0'){
            System.out.println("bbbb");
        }
        if (arry4[1] == '\u0000'){
            System.out.println("cccc");  //输出cccc
        }
        System.out.println((arry4[0] + 1)); //输出1
//        boolean型数组元素的默认初始化值:
        boolean[] arry5 = new boolean[2];
        System.out.println(arry5[0]); //输出false

//        引用数据类型数组元素的默认初始化值:null 而不是 "null"
        String[] arry6 = new String[5];
        System.out.println(arry6[0]); // 输出null
        if (arry6[1] == null){
            System.out.println("1111"); //输出1111
        }
        if (arry6[1] == "null"){
            System.out.println("2222");
        }

        //6.数组的内存解析
        int[] a1 = new int[]{1,2,3};
//      int a2 = a1; //会报错:不兼容的类型: int[]无法转换为int
        int[] a2 = a1; //没有new就没有新开辟空间,就用的a1的地址
        a2[1] = 10;
        System.out.println(a1[1]); //输出10
        System.out.println(a1); //输出数组a1的地址[I@776ec8df    其中[表示数组,@表示地址,776ec8df表示地址的数值,且为十六进制
        System.out.println(a2); //输出数组a2的地址[I@776ec8df

    }
}

案例1:

package com.atguigu1.one.exer1;

/**
 * 案例:"破解"房东电话
 *
 * 升景坊单间短期出租4个月,550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。屋内均是IT行业人士,喜欢安静。
 * 所以要求来租者最好是同行或者刚毕业的年轻人,爱干净、安静。
 *
 */

/**
 * ClassName: ArrayExer
 * Package: com.atguigu1.one.exer1
 * Description: 案例
 *
 * @Author 随心油条
 * @Create 2024/1/25 14:07
 * @Version 1.0
 */
public class ArrayExer {
    public static void main(String[] args) {
        int[] arr = new int[]{ 8, 6, 1, 0, 3};
        int[] index = new int[]{ 2, 4, 3, 1, 0, 4, 1, 2, 1, 4, 2};

        String tel = "";

        for (int i = 0; i < index.length; i++) {
            int value = index[i];
            tel += arr[value];
        }
        System.out.println("联系方式: " + tel);//输出:18013820100
    }
}

案例2:

需求:
案例:输出英文星期几

用一个数组,保持星期一到星期天的7个英语但粗,从键盘输入1-7,显示对应的单词
{"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}

拓展:一年12个月的存储

用一个数组,保存12个月的英语单词,从键盘输入1-12,显示对应的单词。
{"January","February","March","April","May","June","July","August","September","October","November","December"}
代码:
package com.atguigu1.one.exer2;

import java.util.Scanner;

/**
 * ClassName: ArrayExer
 * Package: com.atguigu1.one.exer2
 * Description: 案例:输出英文星期几
 *
 * 用一个数组,保存星期一到星期天的7个英语单词,从键盘输入1-7,显示对应的单词
 * {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}
 *
 * @Author 随心油条
 * @Create 2024/1/25 14:15
 * @Version 1.0
 */

public class ArrayExer02 {
    public static void main(String[] args) {
//        定义包含7个单词的数组
        String[] weeks = new String[]{ "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};

//        从键盘获取指定的数值,使用Scanner
        Scanner input = new  Scanner(System.in);
        System.out.print("请输入1-7的整数: ");
        int chooes = input.nextInt();
//        没有定义数组的时候就这么做,现在定义数组了就换种方式.
//        switch (chooes) {
//            case 1:
//                System.out.println("您的结果为: " + weeks[0]);
//                break;
//            case 2:
//                System.out.println("您的结果为: " + weeks[1]);
//                break;
//            case 3:
//                System.out.println("您的结果为: " + weeks[2]);
//                break;
//            case 4:
//                System.out.println("您的结果为: " + weeks[3]);
//                break;
//            case 5:
//                System.out.println("您的结果为: " + weeks[4]);
//                break;
//            case 6:
//                System.out.println("您的结果为: " + weeks[5]);
//                break;
//            case 7:
//                System.out.println("您的结果为: " + weeks[6]);
//                break;
//        }

//        针对获取的数据进行判断即可
        if (chooes < 1 || chooes > 7){
            System.out.println("您的输入有误!!");
        }else {
            System.out.println("您的结果为:" + weeks[chooes - 1]);
        }

        input.close();
    }
}

案例3:

需求:
案例:学生考试等级划分

从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
	成绩>=最高分-10    等级为’A’
	成绩>=最高分-20    等级为’B’
	成绩>=最高分-30    等级为’C’
	其余              等级为’D’

提示:先读入学生人数,根据人数创建int数组,存放学生成绩。
代码1:
package com.atguigu1.one.exer3;

import java.util.Scanner;

/**
 * ClassName: ArrayExer03
 * Package: com.atguigu1.one.exer3
 * Description: 从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
 *
 *  * 成绩>=最高分-10    等级为’A’
 *  * 成绩>=最高分-20    等级为’B’
 *  * 成绩>=最高分-30    等级为’C’
 *  * 其余              等级为’D’
 *
 * @Author 随心油条
 * @Create 2024/1/25 14:35
 * @Version 1.0
 */
public class ArrayExer03 {
    public static void main(String[] args) {

        //1.从键盘数入学生的人数,根据人数,创建数组(动态初始化)
        Scanner input = new Scanner(System.in);
        System.out.print("请输入学生的人数: ");
        int studentNum = input.nextInt();
        int[] num = new int[studentNum];

        //2.根据提示,依次输入学生成绩,并将成绩保存在数组元素中
        System.out.println("请依次输入学生成绩: ");
        int[] scores = new int[studentNum];
        for (int i = 0; i < studentNum; i++) {
            int score = input.nextInt();
            scores[i] =score;
        }


        //3.获取学生成绩的最大值
        int maxScore = scores[0];
        for (int i = 1; i < scores.length; i++){
            if (maxScore < scores[i]){
                maxScore = scores[i];
            }
        }
        System.out.println("学生成绩最大值为: " + maxScore);

        //4.遍历数组元素,根据学生成绩与最高分的差值,得到每个学生的等级,并输出成绩和等级
        for (int i = 0; i < scores.length; i++){
            if (maxScore - scores[i] <= 10){
                System.out.println("student[" +i +"]的成绩为: " + scores[i] + '\t' + "等级为A");
            } else if (maxScore - scores[i] <= 20) {
                System.out.println("student[" +i +"]的成绩为: " + scores[i] + '\t' + "等级为B");
            }else if (maxScore - scores[i] <= 30) {
                System.out.println("student[" +i +"]的成绩为: " + scores[i] + '\t' + "等级为C");
        }else {
                System.out.println("student[" +i +"]的成绩为: " + scores[i] + '\t' + "等级为D");
            }
        }

        //关闭资源
        input.close();
        }
}
代码2:
package com.atguigu1.one.exer3;

import java.util.Scanner;

/**
 * ClassName: ArrayExer03_1
 * Package: com.atguigu1.one.exer3
 * Description: 基于ArrayExer03的改进
 *
 * @Author 随心油条
 * @Create 2024/1/25 15:26
 * @Version 1.0
 */
public class ArrayExer03_1 {
    public static void main(String[] args) {

        //1.从键盘数入学生的人数,根据人数,创建数组(动态初始化)
        Scanner input = new Scanner(System.in);
        System.out.print("请输入学
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值