前言
今天与看客老爷们一起探讨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;
}
通过监视,我们可以发现其数组的元素:
本次的知识分享就到此结束啦,码字不易,如果这篇文章对你有所帮助,请别吝啬您手中的三连啦,您的三连就是我分享知识的动力。