Java基础篇——数组详解

项目开发中,若是须要存储大量的数据,例如若是须要读取100个数,那么就须要定义100个变量,显然重复写100次代码,是没有太大意义的。Java语言提供了数组(array)的数据结构,能够解决这个问题。数组


数组的概念

一个数组是相同数据类型的元素按必定顺序排列的集合。使用数组能够将同一类型的数据存储在连续的内存位置。数组中各元素的类型相同,经过下标的方式来访问数组中的元素,下标从0开始。微信

由此得出,数组具备如下基本特色:数据结构

  • 数组的长度是肯定的,数组一旦被建立,它的大小就是不能够改变的。架构

  • 数组的元素必须是相同类型,不能出现混合类型。app

  • 数组类型能够是任意数据类型,包括基本数据类型和引用类型。spa

数组在使用以前必须先声明,也就是要先定义后使用。一维数组的定义格式为:.net

  • 数据类型[] 数组名;3d

  • 数据类型 数组名[];orm

这两种声明方式彻底等价,不过在实际开发中,咱们通常推荐使用第一种方式。对象

数组的初始化

数组声明以后,仅仅是定义了一个数组引用,系统并无为数组分配任何内存,所以如今还不能访问它的任何元素。必须通过数组初始化后,才能使用数组的元素。

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

  • 静态初始化就是在定义数组的同时给数组元素赋值。静态初始化使用一对大括号将初值括起来,大括号中元素的个数就是数组的长度。

格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…};

例如:int[] arr = new int[]{1,2,3,4};

  • 动态初始化就是在定义数组时,只指定数组的长度,不为它赋值。在使用到的时候在给它添加元素。

格式:数据类型[] 数组名 = new 数据类型[数组长度];

例如:

int[] arr = new int[4];

arr[0] = 1;

arr[1] = 2;

arr[2] = 3;

arr[3] = 4


数组内存图解

首先咱们要先了解Java中堆和栈的概念。咱们能够这样理解:

咱们定义的局部变量都存储在栈中;而堆中存放的都是数组和对象(其实数组也是对象)。凡是new创建的都是在堆中,堆中存放的都是实体(对象),实体能够有多个属性,若是一个数据消失,这个实体没有消失,还能够用,因此堆是不会释放的;可是栈不同,栈里存放的都是单个变量,变量被释放了,那就没有了。

下面,咱们经过对一个数组的声明和初始化的例子来看内存的分配状况。

1.声明一个数组

int[] s = null;

这时,只是声明了一个数组变量,这个变量存储在栈中,堆内存中是不会发生变化的:


2.给数组分配空间

s = new int[10];

当给数组分配空间之后,才会在堆内存中给数组真的分配空间,而且变量 s 会指向数组在堆内存中的地址:


3.给数组元素赋值

for(int i = 0;i < 10; i++) {

    s[i] = i + 1;

}



遍历数组

遍历数组有两种方式:

  • 普通 for 循环

for(int i = 数组第一个元素的下标; i < 数组名.length; i++){

    System.out.println(数组名[i]); // 输出下标为 i 的元素值

}


数组中的元素个数 length 是数组类中惟一的数据成员变量,使用 new 建立数组时系统自动给 length 赋值。数组一旦建立完毕,其大小就固定下来了。

  • 加强 for 循环(JDK 1.5以后可用)

for(数组中元素的数据类型 变量名 :数组名){

    System.out.println(变量名); // 输出元素值

}


多维数组

数组元素能够声明为任何类型,当数组的类型是一个一维数组类型时,这样能够创建数组的数组,即二维数组。同理,能够获得多维数组。通常来说,n 维数组 n-1 维数组的数组。声明多维数组时使用类型及多对方括号。以二维数组为例,定义格式以下:

类型[][] 数组名;

也可使用以下两种方式声明一个二维数组:

类型[] 数组名[];

类型 数组名[][];

推荐使用第一种。例如:int[][] arr; 就表示一个二维数组。

多维数组的初始化

与一维数组同样,多维数组的初始化也分为静态和动态两种。

静态初始化时,在定义数组的同时为数组元素赋值。例如,二维数组 arr 的初始化以下:

int[][] arr = {{1,2}, {2,6}, {7,9}};

这里,没必要指出数组每一维的大小,系统会根据初始化时给出的初值的个数自动计算数组每一维的大小。外层括号所包含各元素是数组第一维的各元素,内层括号对应于数组第二维的元素

对二维数组进行动态初始化时,有两种分配内存空间的方法:直接分配与按维分配。

  • 直接分配就是直接为每一维分配空间,声明数组时,给出各维的大小。以二维数组为例,定义格式以下:

类型[][] 数组名 = new 类型[第一维数组的长度][第二维数组的长度];

例如:

int[][] arr = new int[2][3]; 

声明了一个2行3列的二维数组。

  • 按维分配是从最高维起,分别为每一维分配内存。

建立二维数组的通常格式为:

类型[][] 数组名 = new 类型[第一维数组的长度][];

数组名[0] = new 类型[第二维数组的长度];

数组名[1] = new 类型[第二维数组的长度];

……


若是建立数组时第二维大小是同样的,则建立的是一个矩阵数组。

多维数组的访问

在定义并初始化多维数组后,可使用多维数组中的每一个元素。仍以二维数组为例,访问方式为:

数组名[第一维下标][第二维下标];

数组下标都是从 0 开始,第一维也称为行,第二维也称为列。


二维数组也有length属性,但它只表示第一维数组的长度。例如:

int[][] a = new int[3][4];

a.length 的值就是 3,a[0].length 的值就是 4。

缘由以下:


点个关注吧,我会持续更新更多干货~~


本文分享自微信公众号 - Java架构成长之路(K469785635)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索