你真的了解JAVA数组吗?(上)

「爱情、让人受尽委屈。」 2023-07-18 14:27 260阅读 0赞

什么是数组?
  数组是相同类型的变量按顺序组成的一种复合数据类型,这些相同类型的变量称为数组的元素或单元。数组通过数组名加索引来使用数组的元素,索引从 0 开始

1.数组的声明
  声明数组包括声明数组的名字、数组元素的数据类型。
  声明一维数组有下列两种格式:

  1. 数组的元素类型 数组名字[];
  2. 数组的元素类型[] 数组名字;

声明二维数组有下列两种格式:

  1. 数组的元素类型 数组名字[][];
  2. 数组的元素类型[][] 数组名字;

例如:

  1. float[] boy; //一维数组
  2. char cat[][]; //二维数组

.
  那么数组 boy 的元素可以存放 float 型数据,数组 cat 的元素可以存放 char 型数据。
  数组的元素类型可以是 Java 中的任一种类型。假如已经声明一种 Person 类型数据,那么可以如下声明一个数组:

  1. Person ps[];

将来数组 ps 的元素可以存放 Person 类型的数据。

*注:与 C/C++ 不同,Java 不允许在声明数组中的方括号内指定数组元素的个数。*
若声明:

  1. int a[12];

  1. int[12] a;

将导致语法错误。

2.数组的创建
  声明数组仅仅是给出了数组名字和元素的数据类型,要想真正使用数组还必须为它分配内存空间,即创建数组。
  为数组分配内存空间的格式如下:

  1. 数组名字 = new 数组元素的类型[数组元素的个数];

例如:

  1. boy = new float[4];

.
  为数组分配内存空间后,数组boy获得 4 个用来存放 float 类型数据的内存空间,即 4 个 float 型元素。数组变量 boy 中存放着这些内存单元的首地址,该地址称为数组的引用,这样数组就可以通过索引操作这些内存单元。数组属于引用型变量,数组变量中存放着数组的首元素地址,通过数组名加索引使用数组的元素,例如:

  1. boy[0] = 12;
  2. boy[1] = 23.901F;
  3. boy[2] = 100;
  4. boy[3] = 10.23f;

内存分配示意图如下:
在这里插入图片描述
声明数组和创建数组可以一起完成,例如:

  1. float boy[] = new float[4];

二维数组和一维数组一样,在声明之后必须用 new 运算符分配内存空间,例如:

  1. int test[][];
  2. test = new int[3][4];

  1. int test[][] = new int[3][4];

.
  Java采用“数组的数组”声明多维数组,一个二维数组是由若干个一维数组构成的。
  例如:上述创建的二维数组 test 就是由 3 个长度为 4 的一维数组test[0]、test[1] 和 test[2] 构成的。
  构成二维数组的一维数组不必有相同的长度,在创建二维数组时可以分别指定构成该二维数组的一维数组的长度,例如:

  1. int a[][] = new int[3][];

.
  创建了一个二维数组 a,a 由3个一维数组 a[0]、a[1] 和 a[2]构成,但它们的长度还没有确定,即这些一维数组还没有分配内存空间,所以二维数组 a 还不能使用,必须创建它的3个一维数组。例如:

  1. a[0] = new int[6];
  2. a[1] = new int[12];
  3. a[2] = new int[8];

:和 C 语言不同的是,Java允许使用 int 型变量的值指定数组元素的个数。例如:

  1. int size = 30;
  2. double number[] = new double[size];

3.数组元素的使用
  一维数组通过索引符访问自己的元素,如 boy[0]、boy[1]等。需要注意的是,索引从 0 开始,因此,数组若有 7 个元素,那么索引到 6 为止。如果程序使用了如下语句:

  1. boy[7] = 384.98f;

程序可以编译通过,但运行时将发生 ArrayIndexOutOfBoundsException 异常,因此,用户在使用数组时必须谨慎,防止索引越界
在这里插入图片描述
二维数组也通过索引符访问自己的元素,如 a[0][1]、a[1][2] 等。需要注意的是,索引从 0 开始,例如声明创建了一个二维数组 a:

  1. int a[][] = new int[2][3];

那么第一个索引的变化范围是从 0 到 1,第二个索引的变化范围从 0 到 2。

4.length的使用
  数组的元素的个数称为数组的长度。对于一维数组,“数组名字.length”的值就是数组中元素的个数;对于二维数组,“数组名字.length”的值是它含有的一维数组的个数。例如,对于:

  1. float a[] = new float[12];
  2. int b[][] = new int[3][6];

a.length 的值是 12,b.length 的值是3。

5.数组的初始化
  创建数组后,系统会给每个数组元素一个默认的值,例如,float 型是 0.0。
  在声明数组的同时也可以给数组的元素一个初始值,例如:

  1. float boy[] = { 21.3f,23.89f,2.0f,23f,778.98f};

上述语句相当于:

  1. float boy[] = new float[5];

然后:

  1. boy[0] = 21.3f;
  2. boy[1] = 23.89f;
  3. boy[2] = 2.0f;
  4. boy[3] = 23f;
  5. boy[4] = 778.98f;

也可以直接用若干个一维数组初始化一个二维数组,这些一维数组的长度不尽相同,例如:

  1. int a[][] = { { 1},{ 1,1,},{ 1,2,1},{ 1,3,3,1},{ 1,4,6,4,1}};

6.数组的引用
  相信大多数朋友已经知道,数组属于引用型变量,因此,两个相同类型的数组如果具有相同的引用,它们就有完全相同的元素。
例如,对于:

  1. int a[] = { 1,2,3},b[] = { 4,5};

数组 a 和 b 中分别存放着引用 0x35ce36 和 0x757aef,内存模型如下图所示:
在这里插入图片描述
如果使用了下列赋值语句(a 和 b 的类型必须相同):

  1. a = b

那么,a 中存放的引用和 b 的相同,这时系统将释放最初分配给数组 a 的元素,使得 a 的元素和 b 的元素相同,a 、b 的内存模型变成如下图所示:
在这里插入图片描述
下面的例子使用了数组,运行效果如下图所示:
在这里插入图片描述
例子代码如下:

  1. public class Main {
  2. public static void main(String[] args) {
  3. int a[] = { 1, 2, 3, 4};
  4. int b[] = { 100, 200, 300};
  5. System.out.println("数组a的元素个数 = " + a.length);
  6. System.out.println("数组b的元素个数 = " + b.length);
  7. System.out.println("数组a的引用 = " + a);
  8. System.out.println("数组b的引用 = " + b);
  9. System.out.println("a == b 的结果是" + (a == b));
  10. a = b;
  11. System.out.println("数组a的元素个数 = " + a.length);
  12. System.out.println("数组b的元素个数 = " + b.length);
  13. System.out.println("数组a的引用 = " + a);
  14. System.out.println("数组b的引用 = " + b);
  15. System.out.println("a == b 的结果是" + (a == b));
  16. System.out.println("a[0] = " + a[0] + ",a[1] = " + a[1] + ",a[2] = " + a[2]);
  17. System.out.print("b[0] = " + b[0] + ",b[1] = " + b[1] + ",b[2] = " + b[2]);
  18. }
  19. }

需要注意的是,对于 char 型数组 a,System.out.println(a) 不会输出数组 a 的引用,而是输出数组 a 的所有元素的值。
例如,对于:

  1. char a[] = { 'A','你','好','呀'};

System.out.println(a) 的输出结果是:

  1. A你好呀

如果想输出 char 型数组的引用,必须让数组 a 和字符串做并置运算。
例如:

  1. System.out.println("" + a);

其输出结果是数组的引用。

感谢师傅来访,技术不精,请勿吐槽,如有问题请留言。

发表评论

表情:
评论列表 (有 0 条评论,260人围观)

还没有评论,来说两句吧...

相关阅读

    相关 了解websocket

    一、概述 > http1.0余http1.1支持长连接的详解 > HTTP作为应用层协议,其实它的生命周期在服务器返回结果时就已经结束了,而所谓的支持长连接,其实是基

    相关 了解java序列化

    问:可是我这个实体类,没有实现序列化那个接口,也能存到数据库,这是为什么呢? 想不通!我是用的注解和hibernate框架弄的! 难道说不实现序列化接口也能保存数据?