重学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.二维数组内存图

三、总结

相关推荐
色空大师4 分钟前
23种设计模式
java·开发语言·设计模式
闲人一枚(学习中)4 分钟前
设计模式-创建型-建造者模式
java·设计模式·建造者模式
Bruce小鬼16 分钟前
QT文件基本操作
开发语言·qt
2202_7544215422 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
蓝染-惣右介24 分钟前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis
小林想被监督学习25 分钟前
idea怎么打开两个窗口,运行两个项目
java·ide·intellij-idea
HoneyMoose27 分钟前
IDEA 2024.3 版本更新主要功能介绍
java·ide·intellij-idea
我只会发热29 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
是老余30 分钟前
本地可运行,jar包运行错误【解决实例】:通过IDEA的maven package打包多模块项目
java·maven·intellij-idea·jar
crazy_wsp31 分钟前
IDEA怎么定位java类所用maven依赖版本及引用位置
java·maven·intellij-idea