Java数组的动态初始化和常见问题解析

 更新时间:2024年10月21日 11:26:47   作者:洛上言  
本文介绍了数组动态初始化的概念,即在初始化时仅指定数组长度,系统会为数组分配初始值,而静态初始化则手动指定数组元素,系统根据元素个数计算数组长度,这两种初始化方式应用场景不同,另外,还讲述了数组默认初始化值的规律及数组常见问题,如越界问题等

一、为什么有数组动态初始化呢?

如果一开始就知道数组里的数据,就可以使用静态初始化去完成。

但是如果一开始就不知道要添加什么数据,那此时大括号中写什么呢?

int[] arr = {1, 2, 3, 4, 5};
int[] arr = {????}

是不是感觉写什么都不太合适。所以动态初始化和静态初始化的应用场景是不一样的。

二、动态初始化

动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。

格式:

数据类型[] 数组名 = new 数据类型[数组长度];

示例:

下述代码表示arr数组里只能存3个int类型的整数。

int[] arr = new int[3];

三、代码示例

需求:

定义一个数组,用来存班级中50个学生的姓名。

姓名未知,等学生报道之后,再进行添加。

package com.itheima.arraydemo;

public class ArrayDemo4 {
    public static void main(String[] args) {
        //格式:
        //数据类型[] 数组名 = new 数据类型[数组的长度];
        //在创建的时候,由我们自己指定数组的长度,由虚拟机给出默认的初始化值

        String[] arr = new String[50];
        //添加学生
        arr[0] = "zhangsan";
        arr[1] = "lisi";
        //获取
        System.out.println(arr[0]);//zhangsan
        System.out.println(arr[1]);//lisi
        System.out.println(arr[2]);//打印出来的是默认初始化值null
    }
}

四、数组默认初始化值的规律

  • 整数类型:默认初始化值0
  • 小数类型:默认初始化值0.0
  • 字符类型:默认初始化值’\u0000’ 空格
  • 布尔类型:默认初始化值 false
  • 引用数据类型:默认初始化值 null,String就是一个引用数据类型
int[] arr2 = new int[3];
System.out.println(arr2[0]);//0
System.out.println(arr2[1]);//0
System.out.println(arr2[2]);//0

五、数组动态初始化和静态初始化的区别

1、动态初始化:手动指定数组长度,由系统给出默认初始化值。

只明确元素个数,不明确具体数值,推荐使用动态初始化

例如:使用数组容器来存储键盘录入的5个整数。

int[] arr = {????}; // 不明确数组中应该存储哪些
int[] arr = new int[5]; // 就使用动态初始化

2、静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度。

需求中已经明确了要操作的具体数据,直接静态初始化即可。

例如:将全班的学生成绩存入数组中:11,22 ,33

int[] arr = {11, 22, 33};

六、数组常见问题:越界

当访问了数组中不存在的索引,就会引发索引越界异常

package com.itheima.arraydemo;

public class ArrayDemo5 {
    public static void main(String[] args) {
        //1.定义一个数组
        int[] arr = {1,2,3,4,5};
        //长度:5
        //最小索引:0
        //最大索引:4(数组的长度 - 1)
        //如果访问的数字不在这个范围(0 ~ 4)就会报索引越界异常
        System.out.println(arr[2]);


        //小结:
        //索引越界异常
        //原因:访问了不存在的索引
        //避免:只要知道索引的范围就行了
        //最小索引:0
        //最大索引:(数组的长度 - 1)
    }
}

下图的红色就表示代码出现了问题,通常我们也会说代码报错了。

阅读报错的信息:Exception:异常,异常在main里。java.lang.ArrayIndexOutOfBoundsException 是异常的名字,叫做:索引越界异常。后面就会紧接着异常出现的解释:

Index 10 out of bounds for length 5

索引10已经超过了长度为5的数组。

at:表示 com.itheima.arraydemo 是包名,ArrayDemo5 是类名。

main 是方法名。ArrayDemo5.java:10 表示异常出现的位置,这里就表示在第10行出现了问题。

点一下,它就会自动跳转到第10行。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MyBatis延迟加载与立即加载案例教程

    MyBatis延迟加载与立即加载案例教程

    这篇文章主要介绍了MyBatis延迟加载与立即加载案例教程,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • springboot maven 打包插件介绍及注意事项说明

    springboot maven 打包插件介绍及注意事项说明

    这篇文章主要介绍了springboot maven 打包插件介绍及注意事项说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • 搭建JavaWeb服务器步骤详解

    搭建JavaWeb服务器步骤详解

    本篇文章主要给大家详细分享了搭建JavaWeb服务器的详细步骤以及用到的代码,对此有需要的朋友可以跟着学习下。
    2018-02-02
  • 简单易懂的Java Map数据添加指南

    简单易懂的Java Map数据添加指南

    Java提供了多种方法来往Map中添加数据,开发者可以根据具体需求选择合适的方法,需要的朋友可以参考下
    2023-11-11
  • 解决springboot整合cxf启动报错,原因是版本问题

    解决springboot整合cxf启动报错,原因是版本问题

    这篇文章主要介绍了解决springboot整合cxf启动报错,原因是版本问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • Springboot整合多数据源代码示例详解

    Springboot整合多数据源代码示例详解

    这篇文章主要介绍了Springboot整合多数据源代码示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java定时器Timer的源码分析

    Java定时器Timer的源码分析

    通过源码分析,我们可以更深入的了解其底层原理。本文将通过Timer的源码,带大家深入了解Java Timer的使用,感兴趣的小伙伴可以了解一下
    2022-11-11
  • SpringBoot项目启动报错踩坑实战记录

    SpringBoot项目启动报错踩坑实战记录

    这篇文章主要给大家介绍了关于SpringBoot项目启动报错踩坑的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • Java多线程中Callable和Future的解读

    Java多线程中Callable和Future的解读

    这篇文章主要介绍了Java多线程中Callable和Future的解读,Callable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,需要的朋友可以参考下
    2023-09-09
  • IDEA实现JDBC的操作步骤

    IDEA实现JDBC的操作步骤

    JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,本文给大家介绍IDEA实现JDBC的操作步骤,感兴趣的朋友一起看看吧
    2022-01-01

最新评论