【重学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 作者:大耳朵宋宋

    相关文章
    |
    测试技术 PHP 开发者
    PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
    PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
    |
    存储 Go 索引
    go语言中的数组(Array)
    go语言中的数组(Array)
    442 67
    |
    人工智能 Java
    Java 中数组Array和列表List的转换
    本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
    1126 1
    Java 中数组Array和列表List的转换
    |
    JavaScript 前端开发 API
    JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
    array.map()可以用来数据转换、创建派生数组、应用函数、链式调用、异步数据流处理、复杂API请求梳理、提供DOM操作、用来搜索和过滤等,比for好用太多了,主要是写法简单,并且非常直观,并且能提升代码的可读性,也就提升了Long Term代码的可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
    |
    移动开发 运维 供应链
    通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
    array.some()可以用来权限检查、表单验证、库存管理、内容审查和数据处理等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
    |
    供应链 JavaScript 前端开发
    通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
    array.every()可以用来数据验证、权限检查、一致性检查等数据校验工作,核心在于利用其短路机制,速度更快,节约性能。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
    |
    Web App开发 存储 前端开发
    别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
    这类问题的重点在于能不能突破基础思路,突破基础思路是从程序员入门变成中级甚至高级的第一步,如果所有需求都通过最基础的业务逻辑来做,是得不到成长的。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
    |
    数据采集 JavaScript 前端开发
    JavaScript中通过array.filter()实现数组的数据筛选、数据清洗和链式调用,JS中数组过滤器的使用详解(附实际应用代码)
    用array.filter()来实现数据筛选、数据清洗和链式调用,相对于for循环更加清晰,语义化强,能显著提升代码的可读性和可维护性。博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
    |
    人工智能 前端开发 JavaScript
    拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
    本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
    918 5
    |
    存储 Java
    Java“(array) <X> Not Initialized” (数组未初始化)错误解决
    在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
    781 2

    热门文章

    最新文章

  1. 1
    PHP 数组查找:为什么 `isset()` 比 `in_array()` 快得多?
    372
  2. 2
    Java 中数组Array和列表List的转换
    1126
  3. 3
    JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、复杂API请求、DOM操作、搜索和过滤等,array.map()的使用详解(附实际应用代码)
    831
  4. 4
    通过array.reduce()实现数据汇总、条件筛选和映射、对象属性的扁平化、转换数据格式、聚合统计、处理树结构数据和性能优化,reduce()的使用详解(附实际应用代码)
    1651
  5. 5
    通过array.some()实现权限检查、表单验证、库存管理、内容审查和数据处理;js数组元素检查的方法,some()的使用详解,array.some与array.every的区别(附实际应用代码)
    805
  6. 6
    通过array.every()实现数据验证、权限检查和一致性检查;js数组元素检查的方法,every()的使用详解,array.some与array.every的区别(附实际应用代码)
    574
  7. 7
    多维数组操作,不要再用遍历循环foreach了!来试试数组展平的小妙招!array.flat()用法与array.flatMap() 用法及二者差异详解
    411
  8. 8
    别再用双层遍历循环来做新旧数组对比,寻找新增元素了!使用array.includes和Set来提升代码可读性
    394
  9. 9
    Array.forEach实战详解:简化循环与增强代码可读性;Array.forEach怎么用;面对大量数据时怎么提高Array.forEach的性能
    279
  10. 10
    深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解
    902