【重学Javase】—— 数组(从头剖析一维数组,二维数组,array常用工具类以及数组的两种常见异常)

简介: 【重学Javase】—— 数组(从头剖析一维数组,二维数组,array常用工具类以及数组的两种常见异常)

数组的概述

1、数组的理解

是多个相同类型数据按一定顺序排列的集合, 并使用一个名字(数组名)命名, 并通过编号(下标)的方式,对这些数据进行统一管理。其中,数组中元素的个数称为数组长度。

2、数组的特点:

    1. 数组是序排列的
    2. 数组属于引用数据类型的变量。数组的元素,既可以是基本数据类型(int,double,char……),也可以是引用数据类型(string)
    3. 创建数组对象会在内存中开辟一整块连续的空间, 而数组名中引用的是这块连续空间的首地址。
    4. 数组的长度一旦确定,就不能修改。

    3、数组的分类:

    ① 照维数:一维数组、二维数组、。。。

    ② 照数组元素的类型:基本数据类型元素的数组、引用数据类型元素的数组

    一维数组

    1、一维数组的声明与初始化

           一维数组的声明方式:

          type var[] 或 type[] var;

    Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法

            int num;//声明
        num = 10;//初始化
        int id = 1001;//声明 + 初始化
        int[] ids;//声明
        //1.1 静态初始化:数组的初始化和数组元素的赋值操作同时进行
        ids = new int[]{1001,1002,1003,1004};
        //1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
        String[] names = new String[5];
          int[] arr4 = {1,2,3,4,5};//类型推断
    //错误的方式:
    //    int[] arr1 = new int[];
    //    int[5] arr2 = new int[5];
    //    int[] arr3 = new int[3]{1,2,3};

    2、一维数组元素的引用:通过角标的方式调用

    定义并用运算符new为之分配空间后,才可以引用数组中的每个元素,否则会报“空指针异常”

           数组的角标(或索引从0开始的,到数组的长度-1结束)

        ids[0] = 1;
        ids[1] = 2;
        ids[2] = 3;
    //这里[]里面的就叫做数组的下标

    3、数组的属性:length

           每个数组都有一个属性length指明它的长度,例如: a.length 指明数组a的长度(元素个数)

    System.out.println(names.length);//5
    System.out.println(ids.length);//3

    注意:

           这里的数组一旦初始化之后,其长度就是确定的。

                   数组名.length

           数组长度一旦确定,就不可修改。

    4、一维数组的遍历(for循环)

    1. for(int i = 0;i < names.length;i++){
    2.  System.out.println(names[i]);
    3. }

    5、一维数组元素的默认初始化值

    数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。

       > 数组元素是整型:                0

       > 数组元素是浮点型:           0.0

       > 数组元素是char型:    0或'\u0000',而非'0'

       > 数组元素是boolean型:     false

       > 数组元素是引用数据类型: null

    6、一维数组的内存解析

                                                            内存布局

    数组名和地址会存放在栈区,而数组是在堆区,如果是String型的话,是会被放在常量区

    二维数组

    1、如何理解二维数组?

    数组属于引用数据类型,数组的元素也可以是引用数据类型;


    一个一维数组arr的元素如果还是一个一维数组类型的,则此数组称为二维数组。


    对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实, 从数组底层的运行机制来看,其实没有多维数组。

    2、二维数组的声明与初始化

            int[] arr = new int[]{1,2,3};//一维数组
        //静态初始化
        int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
        //动态初始化1
        String[][] arr2 = new String[3][2];
        //动态初始化2
        String[][] arr3 = new String[3][];//可以省略列数,但是不能省略行数
                //二维数组中有3个一维数组。
                //每个一维数组都是默认初始化值null (注意:区别于格式1)
                //可以对这个三个一维数组分别进行初始化
                //arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];
          //自动类型推断(也是正确的写法)
        int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
        int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};//类型推断

    3、特殊写法:

    一维数组:int[] x,int x[]

    二维数组:int[][] y , int[] y[] , int y[][]

    4、多维数组的使用

    5、二维数组内存解析

    6、复制与赋值

    我们先来看一串代码:

    int[] array1, array2;
    array1 = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 };
    array2 = array1;

    很明显,这里是属于赋值 ,内存里面array1和array2指向的是同一块内存(创建快捷方式)

    赋值过程中要么类型相同,要么有自动类型提升的操作,否则会报错。

    Arrays工具类的使用

    java.util.Arrays类即为操作数组的工具类, 包含了用来操作数组(比如排序和搜索) 的各种方法。

    数组排序

    java.util.Arrays类的sort()方法提供了数组元素排序功能:

    import java.util.Arrays;
    public class SortTest {
        public static void main(String[] args) {
            int [] numbers = {5,900,1,5,77,30,64,700};
            Arrays.sort(numbers);
            for(int i = 0; i < numbers.length; i++){
                System.out.println(numbers[i]);
            }
        }
    }

    数组使用中的常见异常

    数组脚标越界异常(ArrayIndexOutOfBoundsException)


    int[] arr = new int[2];

           System.out.println(arr[2]);

           System.out.println(arr[-1]);

    访问到了数组中的不存在的脚标时发生。(0 ~ arr.length-1)


    空指针异常(NullPointerException)

       int[] arr = null;

           System.out.println(arr[0]);

    arr引用没有指向实体,却在操作实体中的元素时调用


    ●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                                                    ——By 作者:大耳朵宋宋

    相关文章
    |
    1月前
    |
    存储 Go 索引
    go语言中的数组(Array)
    go语言中的数组(Array)
    109 67
    |
    3月前
    |
    人工智能 前端开发 JavaScript
    拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
    本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
    |
    3月前
    |
    存储 Java
    Java“(array) <X> Not Initialized” (数组未初始化)错误解决
    在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
    108 2
    |
    3月前
    |
    存储 JavaScript 前端开发
    JavaScript Array(数组) 对象
    JavaScript Array(数组) 对象
    38 3
    |
    3月前
    |
    数据采集 JavaScript 前端开发
    JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
    JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
    |
    4月前
    |
    Go
    Golang语言之数组(array)快速入门篇
    这篇文章是关于Go语言中数组的详细教程,包括数组的定义、遍历、注意事项、多维数组的使用以及相关练习题。
    58 5
    |
    5月前
    |
    Python
    PyCharm View as Array 查看数组
    PyCharm View as Array 查看数组
    133 1
    |
    6月前
    |
    索引
    |
    6月前
    |
    JavaScript API 索引
    JS【详解】Set 集合 (含 Set 集合和 Array 数组的区别,Set 的 API,Set 与 Array 的性能对比,Set 的应用场景)
    JS【详解】Set 集合 (含 Set 集合和 Array 数组的区别,Set 的 API,Set 与 Array 的性能对比,Set 的应用场景)
    97 0
    |
    6月前
    |
    前端开发
    let array = [{id:‘001‘,name:‘小新‘,age:5},{ id:‘002‘,name:‘小葵‘]这样数据如何遍历,拿到其中一个值,数组中装对象如何获取其中一个固定的值
    let array = [{id:‘001‘,name:‘小新‘,age:5},{ id:‘002‘,name:‘小葵‘]这样数据如何遍历,拿到其中一个值,数组中装对象如何获取其中一个固定的值