重学Java 8 数组Arr.2

可现实中,幸福永远缺货

------24.1.17

一、内存图

1.内存:可以理解为"内存条",所有的软件,程序运行起来都会进入到内存中,占用内存,在java的世界中,将内容划分成了5块

2.分为哪五块呢:

①栈(Stack)*

主要运行方法,方法的运行都会进栈内存运行,运行完毕之后,需要"弹栈",为了向空间释放内存

②堆(Heap)*

保存的是对象,数组,每new依次,都会在堆内存中开辟空间,并为这个空间分配一个地址值,堆内存中的数据都是有默认值的

整数:0 小数:0.0 字符:'\u0000' 布尔:false 引用:null

③方法区 (Method Area)*

找到的"预备区",记录了类和方法的信息

方法区中主要保存class文件以及其中的信息

代码运行之前,需要先进内存(方法区)

④本地方法栈(Native Method Stack):专门运行native方法(本地方法)

本地方法可以理解为堆对java功能的扩充

有很多功能,java语言实现不了,所以就需要依靠本地方法完成(C语言编写)

⑤寄存器(pc register):和CPU有关

1.堆、栈、方法区的配合示意图

2.一个数组的内存图

java 复制代码
    public static void main(String[] args) {
        int[] arr1 = new int[3];
        System.out.println(arr1);
        System.out.println(arr1[1]);
        arr1[1] =100;
        System.out.println(arr1[1]);
    }

3.两个数组的内存图

我们创建了两个数组,在堆内存中开辟了两个不同的空间,此时修改一个空间中的数据不会影响到另外一个空间的数据

java 复制代码
    public static void main(String[] args) {
        int[] arr1 = new int[3];
        System.out.println(arr1);
        System.out.println(arr1[1]);
        arr[1] =100;
        System.out.println(arr1[1]);

        int[] arr2 = new int[3];
        System.out.println(arr2);//地址值
        System.out.println(arr2[1]);
        arr2[1] = 200;
        System.out.println("arr1[1] = " + arr1[1]);
        System.out.println("arr2[1] = " + arr2[1]);
    }

4.两个数组指向同一片空间内存图

arr2不是new出来的,是arr1直接赋值给的,arr1在内存中保存的是地址值,给了arr2,那么arr2的地址值和arr1意义,所以此时arr1和arr2指向了堆内存中的同一片空间(同一个地址值,表示同一个数组),此时改变一个数组中的元素会影响到另外一个数组

java 复制代码
    public static void main(String[] args) {
        int[] arr1 = new int[3];
        System.out.println(arr1);
        arr1[1] =100;

        int[] arr2 = arr1;
        System.out.println(arr2);//地址值
        arr2[1] = 200;
        System.out.println("arr1[1] = " + arr1[1]);
        System.out.println("arr2[1] = " + arr2[1]);
    }

二、二维数组

1.二维数组的定义格式

1.概述:数组中套了多个数组

2.定义格式:

①动态初始化

数据类型[ ][ ] 数组名 = new 数据类型[m][n]

数据类型 数组名[ ][ ] = new 数据类型[m][n]

数据类型[ ] 数组名[ ] = new 数据类型[m][n]

m代表的是二维数组的长度

n代表的是二维数组中,一维数组的长度

数据类型[ ][ ] 数组名 = new 数据类型[m][ ] -> 二维数组中的一维数组没有被创建

②静态初始化

数据类型[ ][ ] 数组名 = new 数据类型[ ][ ]{{元素1,元素2,...},{元素1,元素2,...},...}

数据类型 数组名[ ][ ] = new 数据类型[ ][ ]{{元素1,元素2,...},{元素1,元素2,...},...}

数据类型[ ] 数组名[ ] = new 数据类型[ ][ ]{{元素1,元素2,...},{元素1,元素2,...},...}

③简化的静态初始化

数据类型[ ][ ] 数组名 = {{元素1,元素2,...},{元素1,元素2,...},...}

数据类型 数组名[ ][ ] = {{元素1,元素2,...},{元素1,元素2,...},...}

数据类型[ ] 数组名[ ] = {{元素1,元素2,...},{元素1,元素2,...},...}

java 复制代码
    public static void main(String[] args) {
        int[][] arr1 = new int[2][2];
        int[][] arr2 = new int[2][];

        System.out.println();
        String[][] arr3 = {{"唐僧","孙悟空","猪八戒","沙和尚"},{"刘备","关羽","张飞"},{"宋江"},{"贾宝玉","林黛玉"}};
    }

注:动态初始化数组长度必须定死,静态初始化数组长度不用定义好,每一个一维数组的长度根据实际存储的数据数来确定

2.获取二维数组的长度

1.格式:

数组名.length

2.获取每一个一维数组长度,需要先遍历二维数组,将每一个一维数组遍历出来

java 复制代码
    public static void main(String[] args) {
        String[][] arr1 = {{"唐僧","孙悟空","猪八戒","沙和尚"},{"刘备","关羽","张飞"},{"宋江"},{"贾宝玉","林黛玉"}};
        for (int i = 0; i < arr1.length; i++) {
            //获取每一个一维数组的长度
            System.out.println(arr1[i].length);
        }
    }

3.获取、存储二维数组中元素及遍历

获取

①格式:

数组名[i][j]

i:代表的是一维数组在二维数组中的索引位置

j:代表的是元素在一维数组中的索引位置

java 复制代码
    public static void main(String[] args) {
        //获取二维数组中的元素
        String[][] arr1 = {{"唐僧","孙悟空","猪八戒","沙和尚"},{"刘备","关羽","张飞"},{"宋江"},{"贾宝玉","林黛玉"}};
        System.out.println(arr1[0][1]);
        System.out.println(arr1[1][0]);
        System.out.println(arr1[2][0]);
        System.out.println(arr1[3][0]);
    }

存储

①格式:

数组名[i][j] = 值

i:代表的是一维数组在二维数组中的索引位置

j:代表的是元素在一维数组中的索引位置

多行列数对齐操作:ALT键不放鼠标下拉

遍历

①先遍历二维数组,将每一个一维数组遍历出来

②在遍历每一个一维数组,将元素获取出来

java 复制代码
    public static void main(String[] args) {
        String[][] arr1 = {{"唐僧","孙悟空","猪八戒","沙和尚"},{"刘备","关羽","张飞"},{"宋江"},{"贾宝玉","林黛玉"}};
        for (int i = 0; i < arr1.length; i++) {
            //获取每一个一维数组的长度
            System.out.print(arr1[i].length +" ");
            for (int j = 0; j < arr1[i].length; j++) {
                System.out.print(arr1[i][j]+" ");
            }
            System.out.println();
        }
    }

4.二维数组内存图

三、总结

相关推荐
likuolei25 分钟前
XQuery 完整语法速查表(2025 最新版,XQuery 3.1)
xml·java·数据库
雨中飘荡的记忆30 分钟前
LangChain4j 实战指南
java·langchain
okseekw33 分钟前
Java 中的方法:从定义到重载的完整指南
java
雨中飘荡的记忆33 分钟前
深入理解设计模式之适配器模式
java·设计模式
用户849137175471634 分钟前
生产级故障排查实战:从制造 OOM 到 IDEA Profiler 深度破案
java·jvm
雨中飘荡的记忆37 分钟前
深入理解设计模式之装饰者模式
java·设计模式
雨中飘荡的记忆42 分钟前
秒杀系统设计与实现
java·redis·lua
CryptoPP1 小时前
使用 KLineChart 这个轻量级的前端图表库
服务器·开发语言·前端·windows·后端·golang
18你磊哥1 小时前
chromedriver.exe的使用和python基本处理
开发语言·python
小坏讲微服务1 小时前
Spring Cloud Alibaba 整合 Scala 教程完整使用
java·开发语言·分布式·spring cloud·sentinel·scala·后端开发