JavaSE基础笔记——(数组)

这篇博客详细介绍了Java中的数组概念,包括数组的定义、动态和静态初始化、访问数组元素、数组遍历、长度属性以及多维数组。还通过实例展示了如何创建和操作数组,以及处理数组越界等问题。此外,博客还提供了ATM用户登录的示例,涉及用户类和数组的使用。最后,讲解了如何计算多位同学各科成绩的总分和平均分。
摘要由CSDN通过智能技术生成

1、数组是什么?

数组就是用来存储一批同种类型数据的内存区域(可以理解成容器)。

2、为什么要使用数组捏?

  • 代码繁琐:大量的变量定义
  • 业务功能实现很麻烦
  • 单一值类型变量有时候很难满足应用程序的设计要求。     
  • 数组类型变量可以同时存储多个同类型基础数据类型变量或对象。

3、对于数组我们应该学会什么?

  1. 如何定义数组存储数据?
  2. 怎么操作数组元素?
  3. 怎么解决实际问题?
  4. 数组的内存原理?
  5. 数组使用的注意点。

4、数组的特点:

1、只能存放同一数据类型的数据;

2、所有元素数据存放在连续内存空间中;

3、数组大小一旦确定,不能更改。

4、数组通过索引进行区分,数组中的第一个元素的索引为0,最后一个元素索引为数组长度-1。

5、数组在内存中是地址连续的一串空间。

6、数组元素都是变量。元素类型为定义数组类型。

7、数组变量存放的是连续空间首地址。

8、数组创建后,每个元素都会做初始化。int——0 double——0.0 引用类型——null

5、数组定义方式one

静态初始化数组:

定义数组时直接给数组赋值。

格式:

// 数据类型[] 数据名称 = new 数据类型[] { 元素1,元素2,......}
        //double [] scores = new double[] {99.5 , 88.0 , 75.5 } ;
        double [] scores = {99.5 , 88.0 , 75.5 } ;// 简化写法

        //int [] age = new int[] {12 , 24 , 36} ;
        int [] age =  {12 , 24 , 36} ;
// 目标:理解数组的注意事项。
        // 1、 数据类型[] 数组名称 也可以写成 数据类型 数组名称 [] 。
        int [] ages = {11 , 23 , 45};
        int ages1 [] = {11 , 23 , 45};

        // 2、 什么类型的数组只能存放什么类型的元素。
        // String [] names = {"西门吹雪" , "孤独求败" , 23}; // 错误!

        // 3、 数组一旦定义出来后,类型和长度就固定了。
        int [] ages2  = {11 , 23 , 45};
        System.out.println(ages2[3]); // 报错!:长度固定是3了,不能访问第4个元素!!

 访问数组的元素:

数组中的元素通过用对该数组的变量名(引用)加上一个用于描述我们要访问数组哪一个元素的整型索引值来访问。

// 目标:学会访问数组的元素。
        int [] ages = {12 , 24 , 36 };
        //              0    1    2

        // 取值: 数组名称[常识]
        System.out.println(ages[0]);//12
        System.out.println(ages[1]);//24
        System.out.println(ages[2]);//36

        // 赋值: 数组名称[索引] = 数据;
        ages[2] = 100 ;
        System.out.println(ages[2]);//100

        //访问数组的长度
        System.out.println(ages.length);//3

        //数组的最大索引怎么表示? 数组名.length - 1 //前提:元素个数大于0

 6、数组定义方式two

动态初始化数组:

使用new关键字初始化数组,并指定数组大小。

定义数组时,只确定元素的类型和数组的长度,之后再存入具体数据。

格式:

// 当前已经知道存入的元素值,用静态初始化。;当前不知道要存入的数据,用动态初始化。
        //  目标:学会动态初始化数组的定义和使用。
        // 定义数组时候只确定元素的类型和数组的长度,之后再存入具体数据。
        // 动态初始化写法:数据类型[] 数组名 = new 数据类型[长度];
        double [] scores = new double[3] ; // {0.0 , 0.0 , 0.0}
        //                                        0     1     2

        //赋值:
        scores[0] = 99.5;
        System.out.println(scores[0]);

        System.out.println(scores[2]); // 不赋值会采用默认值。


        String[] names = new String[90] ;
        names[0] = "189191";
        names[2] = "马儿扎哈5661";
        System.out.println(names[0]);
        System.out.println(names[1]); // null 是String类型的默认值。
        System.out.println(names[2]);

两种数组定义时的特点和场景的区别:

  • 当前已经知道存入的元素值,使用静态初始化
  •  当前还不知道要存入哪些元素数据,使用动态初始化

掌握动态初始化元素默认值的规则:

        //1、整型数组的元素默认值都是0.
        int[] arr = new int [10];
        System.out.println(arr[0]);
        System.out.println(arr[9]);

        //2、字符char数组的元素默认值是多少呢? 0 ;
        char[] chars = new char[100] ;
        System.out.println((int)chars[0]);
        System.out.println((int)chars[99]);

        //3、浮点型数组的元素默认值 是0.0 。
        double [] scores = new double[90];
        System.out.println(scores[0]);
        System.out.println(scores[89]);

        //4、布尔型数组元素默认值为false。
        boolean[] booleans = new boolean[100] ;
        System.out.println(booleans[0]);
        System.out.println(booleans[99]);

        //5、引用类型的元素默认值为null。
        String[] names = new String[100] ;
        System.out.println(names[0]);
        System.out.println(names[99]);

7、数组的遍历

  • 遍历:就是一个一个数据的访问。
  • 为什么要遍历?因为搜索、数据统计等都需要用到遍历。
// 目标:学会进行数组元素的遍历
        // 什么是遍历?:一个一个把数据访问一遍。
        int [] arr = {12 , 24 , 12 , 48 , 98} ;
        //             0    1    2    3    4

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

        // 终极数组遍历形式:
        for (int i = 0 ; i < arr.length ; i++){
            System.out.println(arr[i]);
        }


        //原始遍历方式
//        System.out.println(arr[0]);
//        System.out.println(arr[1]);
//        System.out.println(arr[2]);
//        System.out.println(arr[3]);
//        System.out.println(arr[4]);

8、数组的长度:

  • 因为数组对象的内存空间是连续的。所以在分配空间的时候必须知道数组的长度。而一旦分配好后就不能修改了。
  • 在使用访问数组元素时,特别要注意,不要超出数组所分配的空间。否则会出现运行时异常:ArrayIndexOutOfBoundsException(数组下标越界异常)。
  • Java语言的数组与其它语言的数组的不同之处在于:Java中的数组是对象。这样做的好处之一为:Java中的每个数组都有一个length属性来代表数组的大小,可以极大地减少数组访问越界的可能性。

小练习:

实现ATM的多用户登录
1 创建一个User类  
包括属性有  1  卡号  字符串类型
                    2  密码   字符串类型
                    3  账上余额  double 类型
2 创建一个存放User数组 存放 5个用户
3 创一个ATM类  类中有一个登录的方法。登录方法需传入User数组  ,并返回登录用户的下标即可。

用户类:

public class AtmUser {
    public String id; //卡号
    public String password;//密码
    public double money;//卡上余额
    public String userName;//用户名

    public AtmUser() {
    }

    public AtmUser(String id, String password , double money,String userName) {
        this.id = id;
        this.password = password;
        this.money = money;
        this.userName = userName;
    }

ATM类:

public class Test2Atm {

    public static void main(String[] args) {
        //创建一个存放用户的数组(五个用户)
        AtmUser [] atmUsers = new AtmUser[5];
        AtmUser atmUser1 = new AtmUser("admin1","123456",1000,"张三");
        AtmUser atmUser2 = new AtmUser("admin2","123456",3000,"李四");
        AtmUser atmUser3 = new AtmUser("admin3","123456",5000,"王五");
        AtmUser atmUser4 = new AtmUser("admin4","123456",7000,"小黑");
        AtmUser atmUser5 = new AtmUser("admin5","123456",9000,"小白");
        atmUsers[0] = atmUser1;
        atmUsers[1] = atmUser2;
        atmUsers[2] = atmUser3;
        atmUsers[3] = atmUser4;
        atmUsers[4] = atmUser5;
        for (int i = 0; i < atmUsers.length; i++) {
            System.out.println(atmUsers[i].id + "\t" +atmUsers[i].money);
        }

        /*System.out.println("欢迎来到登录界面");
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入您的卡号:");
        String userId = sc.next();
        System.out.println("请输入您的密码:");
        String userPassWord = sc.next();
        index(atmUsers,userId,userPassWord);*/

        getIndex(atmUsers);

    }
    //登录方法
/*    public static void index (AtmUser [] atmUsers,String userId , String userPassWord){
            //定义一个临时变量接登录用户的下标
            int index = 0;
            for (int i = 0; i < atmUsers.length; i++) {
                AtmUser atmUser = atmUsers[i];
                if (atmUser.id.equals(userId) && atmUser.password.equals(userPassWord)) {
                    //登陆成功
                    System.out.println("登陆成功!" + "您的账户余额为:" + atmUser.money);
                    index = i;
                    System.out.println("该用户用户名为" + atmUser.id + ",下标为:" + index);
                    break;
                }
            }
            if (index == 0){
                System.out.println("您输入的用户名或密码有误。");
            }
        }*/

//登陆方法:(死循环)
    public static void getIndex (AtmUser [] atmUsers){
        //定义一个临时变量接登录用户的下标
        int index = 0;
        while (true) {
            System.out.println("欢迎来到登录界面");
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入您的卡号:");
            String userId = sc.next();
            System.out.println("请输入您的密码:");
            String userPassWord = sc.next();

            for (int i = 0; i < atmUsers.length; i++) {
                AtmUser atmUser = atmUsers[i];
                if (atmUser.id.equals(userId) && atmUser.password.equals(userPassWord)) {
                    //登陆成功
                    System.out.println("登陆成功!" + "您的账户余额为:" + atmUser.money);
                    index = i;
                    System.out.println("该用户用户名为" + atmUser.id + ",下标为:" + index);
                    break;
                }
            }
            if (index == 0) {
                System.out.println("您输入的用户名或密码有误。");
            }else{
                break;
            }
        }
    }
    }

9、多维数组:

  • 在Java中,我们还可以创建多维的数组。
  • 与一维数组一样,多维数组也是对象,需要一个引用。 语法也可以从一维数组过度而来:

一维数组:int[] a = new int[5];

二维数组:int[][] b = new int[5][5];

三维数组:int[][][] c = new int[5][5][5];

依次类推……

代码演示:

//创建一个一维数组
        int [] nums = new int[5];

        //创建一个二维数组
        //第一个3表示3行;
        // 第二个3表示3列
        //二维数组可以理解为一个行和列的一个数组
        int [] [] arr = new int[3][3];

        //获取第二行第二列的值
        arr[1][1] = 10;

        Scanner sc = new Scanner(System.in);
        System.out.println(arr.length);//3
        //当使用 二维数组时 数组.length 得到的是行数

        //获取列数的长度
        System.out.println(arr[0].length);//3

        //往二维数组里存值
        for (int i = 0; i < arr.length; i++) {
            System.out.println("请输入第" + (i+1) + "行的数据");
            for (int j = 0; j < arr[i].length; j++) {
                System.out.println("请输入第" + (i+1) + "行,第" + (j+1) + "的数据");
                arr[i][j] = sc.nextInt();
            }
        }

        //输出输入的结果
        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("");
        }

小练习:

输入三个同学的 语文,数学,英文的分数。计算出,分别打印每位同学与每门学科的总分与平均分。

 /*
        输入三个同学的 语文,数学,英文的分数
        计算出,三位同学的 总分 平均。
         */
        double sum = 0;//总分
        double [] [] grades = new double[3][3];
        for (int i = 0; i < grades.length; i++) {
            int studentSum = 0;
            System.out.println("请输入第" + (i+1) + "个同学成绩(语文、数学、英语)");
            for (int j = 0; j < grades[i].length; j++) {
                System.out.println("请输入第" + (i+1) + "个同学的第" + (j+1) + "门的成绩");
                grades[i][j] = sc.nextDouble();
                studentSum += grades[i][j];
                sum += grades[i][j];
            }
            System.out.println("第" + (i+1) + "位同学的总成绩为:" + studentSum);
            System.out.println("第" + (i+1) + "位同学的平均成绩为:" + studentSum / grades[0].length);
        }

        //输出输入的结果
        System.out.println("语文" + "\t\t" + "数学" + "\t\t" + "英语" + "\t\t");
        for (int i = 0; i < grades.length; i++) {
            for (int j = 0; j < grades[i].length; j++) {
                System.out.print(grades[i][j] + "\t");
            }
            System.out.println("");
        }
        System.out.println("三位同学总分是:" + sum);
        System.out.println("三位同学平均分是:" + sum/(grades.length * grades[0].length));

        /*
        每个学科的总成绩
         */
        //1、定义一个学科的数组
        double [] subjectSum = new double[3];
        for (int i = 0; i < subjectSum.length; i++) {
            for (int j = 0; j < grades[i].length; j++) {
                subjectSum[i] += grades[j][i];
            }
        }

        /*
        打印每个学科的总成绩和平均分
         */

        for (int i = 0; i < subjectSum.length; i++) {
            System.out.println("第" + (i+1) + "门学科的总成绩为:" + subjectSum[i] + "此学科平均成绩为:" + (String.format("%.2f",subjectSum[i] / 3)));//、如何保留两位小数的方法:String.format("%.2f",f)
        }

java如何保留两位小数:

  1. 使用java.math.BigDecimal

  2. 使用java.text.DecimalFormat

  3. 使用java.text.NumberFormat

  4. 使用java.util.Formatter

  5. 使用String.format

我是看的这位博主的文章:Java保留两位小数的几种写法总结_Archie_java的博客-CSDN博客_java注解保留两位小数相信大家在平时做项目时,可能会有这样的业务需求: 页面或界面上展示的数据保留小数点后两位。 那么这篇文章小编就和大家分享了利用Java保留两位小数的几种写法,文章给出了详细的示例代码,对大家的学习和理解很有帮助,有需要的朋友们下面来一起学习学习下吧。本文列举了几个方法:使用java.math.BigDecimal使用java.text.DecimalFormat使用java.text.NumberFormat使用java.util.Formatter使用String.fo.https://blog.csdn.net/qq_43842093/article/details/121088826?ops_request_misc=&request_id=&biz_id=102&utm_term=java%E4%BF%9D%E7%95%99%E4%B8%A4%E4%BD%8D%E5%B0%8F%E6%95%B04%E7%A7%8D%E6%96%B9%E6%B3%95&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-4-121088826.nonecase&spm=1018.2226.3001.4187

一dian小知识:

  1. 获取字符串中的第几个元素
  2. 字符串转换成字符数组
  3. 字符数组转换成字符串
  4. 字符串的比较不能使用==,而应该使用equals方法

程序实现如下:

        //一个字符串  本质上是一个字符数组
        String str = "hello";
        char [] chars = {'h' , 'e' , 'l' , 'l' , 'o'};
        //获得第几个字符,使用charAt方法charAt(索引)
        /*char c = str.charAt(1);
        System.out.println(c);*/


        //字符串转换为字符数组
        /*char [] chars1 = str.toCharArray();
        for (int i = 0; i < chars1.length; i++) {
            System.out.println(chars1[i]);
        }*/


        //把字符数组转换成字符串
        /*String str1 = String.valueOf(chars);
        System.out.println(str1);*/

        //字符串比较:
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入密码:");
        String pwd = sc.next();
        //字符串比较不能使用==,应该使用:.equals方法。
        if (pwd.equals("loveedu")){
            System.out.println("成功");
        }else{
            System.out.println("失败");
        }

一dian注意事项

// 注意事项。
        //问题1:如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数据索引越界异常)
        int [] arr = {11 , 22 , 33} ;
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
        // System.out.println(arr[3]); // 出现异常

        //问题2:如果数组变量中没有存储数组的地址,而是null,在访问数组信息时会出现NullPointerException(空指针异常)
        arr = null ;
        System.out.println(arr); // null
        System.out.println(arr.length); // 出现异常

关于数组的许多练习题,我都放下下面链接啦,也是我自己做的一些练习。

JavaSE基础——数组练习题_小曹爱编程!的博客-CSDN博客JavaSE基础——数组练习题https://blog.csdn.net/weixin_62993347/article/details/125731924?spm=1001.2014.3001.5502

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值