JavaSE—数组的定义以及应用

本文详细介绍了Java中数组的概念、创建方法(静态和动态),元素的访问,以及内存分配和数据结构,包括虚拟机栈、堆和方法区。通过对比C语言,强调了Java语法的差异和优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

        今天与看客老爷们一起探讨java中数组的定义以及应用,在展开讨论之前,不妨让我们一起想想此前在C语言中学过的数组,试着将两者进行比较,然后脑海里带着答案一起往下看这篇文章!

一、数组的意义

        数组,其实就是用来存放同种类型数据的集合,就像是一个宿舍楼,给同一个学校的学生提供住宿条件。

二、数组的创建和初始化

数组的创建:

        T[] 数组名 = new T[N];//一维数组的创建

        T[][] 数组名 = {{data1,...},{data2....},{data3....},{data4....}};//二维数组的创建

T:数组元素的类型

T[]:数组类型

N:数组元素个数

        在数组创建这一环节,java语法与C语言有一定的差别,C语言中的数组创建方式是

        T_数组名 [N]= {元素};

         可能对于初学java并且以及学过C语言的小伙伴来说,java这种语法更为陌生,而且更为的别扭,但事实上我们从代码的可读性来比较的话,java这种语法明显是更优于C语言的。

数组的初始化

数组的初始化分为两种:静态初始化动态初始化

静态初始化:在初始化数组的时候不指定数组长度,由编译器自行确定数组初始化的时候有多少个元素。

        格式:T[] name = new T[ ]{data1,data2,data3.....};

                   T[] name = {data1, data2, data3.....};

                        (静态初始化中new T[]可以简写省略)

        eg: int[] a = new int[ ]{ 1,2,3 };         //此时编译器会自行判断数组的长度为3

动态初始化:在初始化的时候自行指定数组长度

        格式:T[] name = new T[N];

再谈书写格式,静态初始化和动态初始化可以分为两步走:

 动态初始化:T[] name;                                静态初始化:T[] name ;

                       name = new T[N];                                         name =new T[ ]{data1,data2...};

//千万不能省略new T[]直接给数组赋予变量, 会编译报错


三、数组元素的访问 

        数组在内存中是一段连续的空间,空间的编号是从0开始递增的,因此,我们可以通过访问任意下标来访问对应的数组元素。

        数组元素的访问是: 数组名[ i ];

        i>=0 && i<N(N为数组长度)

        在数组元素访问的过程中要注意不要出现下标越界的情况,否则会编译报错。

数组的遍历:

        将一个数组按照一定顺序逐一访问其数组元素——数组遍历。

//数组遍历: 
  public static void main(String[] args) {
        int[] a = new int[]{1,2,3,4,5,6,7,8,9,0};
    
        for (int i = 0;i < a.length ; i++)
        {
            System.out.println(a[i]);
        }
    }

还有一种更为快捷的遍历写法:for——each

    for(int x : a)                //此处a为数组名
    {
        System.out.println(x);
   
    }

四、数组的存放

        在了解数组在是如何存放的之前,让我们先来了解一下java虚拟机的储存分配。

初始JVM的内存分布:

        1、程序运行代码时需要加载到内存

        2、程序运行时产生的中间变量需要存放到内存

        3、程序中的常量也要存放到内存

        4、部分数据需要长时间存放到内存,部分数据则是随着方法调用结束一同被销毁,存放该种数据所占用的内存会随着数据销毁而被回收。(回收这一步骤由虚拟机自行进行)

JVM数据存储分布如下图所示:

 

细说方法区、虚拟机栈和堆:

虚拟机栈:与方法调用相关的一些信息,每个方法在创建之前都会先开辟一个栈(用于存储方法中需要用到的变量、动态链接、地址值、返回值),开辟的栈帧会在方法调用结束之后销毁,方法中的变量也会跟着一起被销毁。(局部变量在调用结束之后生命周期结束)

:JVM管理最大的内存区域,在实例化和创建对象时所new的对象都是存储在堆里(例如:new int[])存放在堆里的数据只要还在使用就会存在堆随着程序运行开辟程序结束销毁。

方法区:虚拟机中加载的各种信息变量(静态变量、类、方法、常量等),方法编译出来的字节码也是储存在这个区域

看完具体介绍再看看下列图解来加深理解:

我们创建了方法func(),并且在func中定义了常量a和b,还创建了数组

public class demo1 {
    void func()
    {
        int a = 10;
        int b = 20;
        int[] array = new int[]{1,2,3};

    }
    public static void main(String[] args) {
        demo1 d1 = new demo1();
        d1.func();
    }
}

由此我们可以具体画图来理解一下之前所述的内存分布:

不同数组的存放方式: 

一维数组的存放:从低地址向高地址(小端模式)依次、有序地存放

 二维数组的存放:

 如果还有这种刻板的印象,那就应该好好改一改了,因为二维数组的本质其实是一个数组元素为一维数组的数组。

        在Java中有趣的是:Java语法中对于二维数组的列没有严格的要求,但是在C语言和c++中定义数组却不能这样。C语言中数组的定义比较严格,二维数组存放的一维数组要求一维数组的列数要一致。并且在C以及C++中,二维数组会根据数组长度补充元素(默认是补0)

你的数组可以长这个样子:

下面举个例子:

我们分别用Java和C语言定义一个相同的数组,来观察对应的结果

    public static void main(String[] args) {
      
        int[][] array1 = {{1,2,3,4},{5,6},{7},{8,9,10}};
        for(int i = 0;i<array1.length;i++)
        {
            for(int j = 0;j< array1[i].length;j++)
            {
                System.out.print(array1[i][j]+" ");
            }
        }
    }
}

通过Dbug我们可以了解到数组的元素分布是这样的:

 我们再在C语言中定义一个相同元素的数组:

int main(){
	int array[][4] = { {1,2,3,4}, {5,6} ,{7},{8,9,10} };
	for (int i = 0;i < sizeof(array);i++)
	{
		printf("/n");
		for (int j = 0;j < sizeof(array[i]);j++)
		{
			printf("%d ", array[i][j]);
		}
		
	}
	return 0;

}

 通过监视,我们可以发现其数组的元素:


       本次的知识分享就到此结束啦,码字不易,如果这篇文章对你有所帮助,请别吝啬您手中的三连啦,您的三连就是我分享知识的动力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值