• 第六章:Java数组相关


    一:数组基本概念

    (1)什么是数组

    数组:可以看成是相同类型元素的一个集合,在内存中占据连续的空间,每个元素都有自己的编号(下标),起始位置下标为0

    在这里插入图片描述

    (2)数组的创建

    Java中,创建数组的格式如下,其中

    • T:数组中存放元素的类型
    • T[]:表示数组的类型
    • N:表述数组长度
    T[] 数组名 = new T[N];
    
    • 1

    例如下面的例子

    public class TestDemo {
        public static void main(String[] args) {
            //创建一个可以容纳10个int类型元素的数组
            int[] arr1 = new int [10];
    
            //创建一个可以容纳5个double类型元素的数组
            double[] arr2 = new double[5];
    
            //创建一个可以容纳3个字符串元素的数组
            String[] arr3 = new String[3];
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    (3)数组是对象

    Java是一门纯面向对象语言,所以在Java中一切皆对象,数组当然也不例外。当使用int[] arr1 = new int [10]这样的语句创建了一个数组之后,其中arr1就称之为引用变量,存储了对象的地址,它引用或指向了一个数组对象。使用 System.out.println(arr1)打印该引用变量,结果显示

    在这里插入图片描述

    • [:表示这是数组类型
    • I:数组里面存储的是整型
    • @1b6d3586:这是数组地址的哈希值

    (4)数组的初始化

    注意:

    • 不要用C语言的方式定义数组,也即不要出现类似于int arr[] = {1, 2, 3}这样的操作
    • 如果不确定数组当中内容时,使用动态初始化,否则建议使用静态态初始化
    • 如果没有对数组进行初始化,数组中元素有其默认值(基本类型如下表;引用类型默认为null
      在这里插入图片描述

    A:动态初始化

    动态初始化:创建数组时直接指定数组中元素的个数,例如

    int[] array = new int[10];
    
    • 1

    B:静态初始化

    静态初始化:在创建数组时不直接指定数据元素个数,而直接赋值具体数据,例如

    • 静态初始化虽然没有指定数组的长度,但编译器在编译时会根据{}中元素个数来确定数组的长度
    • 静态初始化时, {}中数据类型必须与[]前数据类型一致
    • 静态初始化可以简写,直接省去后面的new T[],即int[] arr1 = {1, 2, 3}(不推荐这样写,因为关键字new更能体现出对象这个含义,而且编译器本身还是会还原的)
    public class TestDemo{
        public static void main(String[] args) {
            int[] arr1 = new int[]{0, 2, 4, 5, 6};
            String[] arr2 = new String[]{"hello", "this", "world"};
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (5)数组的使用

    A:元素访问

    数组元素访问:数组在内存中是一段连续的空间,空间的编号都是从0开始的,然后依次递增,该编号称为数组的下标。数组可以通过下标访问其任意位置的元素。下标取值范围为:[0, N),其中N为元素个数,访问时下标不能大于等于N,否则编译器会报越界错误。如下:

    public class TestDemo{
        public static void main(String[] args) {
            int[] arr = new int[]{1, 2, 3};
            System.out.println(arr[1]);
            System.out.println(arr[3]);//越界
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    B:遍历数组

    遍历数组:遍历是指将数组中的所有元素都访问一遍同时执行某种操作(例如最简单的打印)。遍历数组时需要数组的长度,所以可以使用数组对象.length的方式获取。例如

    public class TestDemo{
        public static void main(String[] args) {
            int[] arr = new int[]{11, 22, 33, 44, 55, 66, 77};
            for(int i = 0; i < arr.length; i++){
                arr[i] *= 2;
                System.out.print(arr[i]+" ");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    二:通过数组深入理解Java中的引用类型

    (1)JVM内存分布

    和C/C++类似,为了对内存进行合理分配和管理,JVM会将内存按照如下逻辑划分

    在这里插入图片描述

    • 程序计数器PC:占据极小的空间,用于保存下一条待执行的指令的地址
    • 虚拟机栈:每个方法在执行时,都会创建一个栈帧,栈帧会保存与该方法相关的信息(例如局部变量);方法运行结束后,栈帧自动销毁,相应数据也随之销毁
    • 本地方法栈:与虚拟机栈作用类似,只不过保存的内容是本地方法的局部变量
    • :这是JVM所管理的最大内存区域。我们使用new创建的对象都是保存在堆上的。堆的生命周期和程序的生命周期一致
    • 方法区:用于存储已经被虚拟机加载的类信息、常量、静态变量、既时编译器编译后的代码等数据。其中字节码就会保存在此区域

    (2)基本类型变量与引用类型变量

    基本类型变量:基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值

    引用类型变量:引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。它类似于C/C++中的指针

    有如下代码,其变量在内存中的分布情况如下图所示

    public class TestDemo {
        public static void main(String[] args) {
            int a = 10;
            int b = 20;
            int[] arr = new int[]{1, 2, 3};
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    如果具有C/C++中指针基础,那么引用变量学习起来应该是没有任何问题的,下面的例子也生动的展示了引用的作用

    public class TestDemo {
        public static void main(String[] args) {
            //定义一个引用变量arr1指向数组
            int[] arr1 = new int[3];
            //利用该引用变量操作数组
            arr1[0] = 10;
            arr1[1] = 20;
            arr1[2] = 30;
    
            int[] arr2 = new int[]{1, 2, 3, 4, 5};
            arr2[0] = 100;
            arr2[1] = 200;
    
            //重点:让arr1指向arr2,然后arr1修改arr2数组
            arr1 = arr2;
            arr1[2] = 300;
            arr1[3] = 400;
            arr1[4] = 500;
    
            for(int i = 0 ; i < arr2.length; i++){
                System.out.println(arr2[i]);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    (3)null

    Java中使用null代表空引用,表示该引用变量不指向任何对象

    • 注意:如果对空引用进行任何读写操作汇报NullPointerException错误
    int[] arr = null;
    
    • 1

    三:数组应用场景

    (1)保存数据

    (2)作为方法的参数

    前面说过,对于基本类型,在传递参数时是传值,也即形参并不会影响到实参。而数组这种引用类型在传参时是传引用,也即形参会直接操作实参

    public class TestDemo {
    
        public static void modif(int[] arr1){
            arr1[0] = 100;
        }
        public static void main(String[] args) {
            int[] arr = new int[]{1, 2, 3};
            System.out.println("修改前:" + arr[0]);
            modif(arr);
            System.out.println("修改后:" + arr[0]);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

  • 相关阅读:
    Word控件Spire.Doc 【页面设置】教程(2):在在 C#、VB.NET 中删除 Word 部分
    LVS+Keepalived+nfs 集群部署及实验
    基于风控特征相关度,挖掘贷中等场景中的存量客户价值|来看看相关实操
    Unity - Alpha Is Transparency
    Python之使用finally代码块释放资源
    机器学习/算法工程师面试题目与答案-数学基础部分
    Flutter笔记:图片的 precacheImage 函数
    GoLong的学习之路(六)语法之指针
    【性能测试】初识 Jmeter 中的 BeanShell
    vue---------商城pc端 购物车模块
  • 原文地址:https://blog.csdn.net/qq_39183034/article/details/125530280