鱼C论坛

 找回密码
 立即注册
查看: 8392|回复: 13

[系列教程] 【Java 教程(原创)】008.Java的数组(上)

[复制链接]
发表于 2017-1-10 20:54:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 零度非安全 于 2017-1-22 15:36 编辑

【Java 教程(原创)】索引帖

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

1>数组的声明
声明数组包括声明数组的名字、数组元素的数据类型。
声明一维数组有下列两种格式:
  1. 数组的元素类型     数组名字[];
  2. 数组的元素类型[]   数组名字;
复制代码
声明二维数组有下列两种格式:
  1. 数组的元素类型      数组名字[][];
  2. 数组的元素类型[][]  数组名字;
复制代码
例如:
  1. float boy[];
  2. char cat[][];
复制代码
那么数组 boy 的元素可以存放 float 型数据,数组 cat 的元素可以存放 char 型数据。
数组的元素类型可以是 Java 中的任一种类型。假如已经声明一种 People 类型数据,那么可以如下声明一个数组:
  1. People china[];
复制代码
将来数组 china 的元素可以存放 People 类型的数据。
注:与 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;
复制代码
内存分配示意图如下:
数组的内存模型.png
声明数组和创建数组可以一起完成,例如:
  1. float boy[] = new float[4];
复制代码
二维数组和一维数组一样,在声明之后必须用 new 运算符分配内存空间,例如:
  1. int mytwo[][];
  2. mytwo = new int[3][4];
复制代码

  1. int mytwo[][] = new int[3][4];
复制代码
Java采用“数组的数组”声明多维数组,一个二维数组是由若干个一维数组构成的。例如:上述创建的二维数组 mytwo 就是由 3 个长度为 4 的一维数组 mytwo[0]、mytwo[1] 和 mytwo[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;boy[1] = 23.89f;boy[2] = 2.0f;boy[3] = 23f;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,内存模型如下图所示:
0.png
如果使用了下列赋值语句(a 和 b 的类型必须相同):
  1. a = b
复制代码
那么,a 中存放的引用和 b 的相同,这时系统将释放最初分配给数组 a 的元素,使得 a 的元素和 b 的元素相同,a 、b 的内存模型变成如下图所示:
1.png
下面的例子使用了数组,运行效果如下图所示:
simpleArrayUse.png
例子代码如下:
simpleArrayUse.java
  1. public class simpleArrayUse{
  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);
复制代码
其输出结果是数组的引用。

在数组的下集中会讲下Java数组的复制。

【特别注意】贴子中的栗子希望鱼油们能自觉的手动敲上去,不要单纯的复制粘贴保存,然后编译运行。






本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-22 13:42:03 | 显示全部楼层
俺现在先去睡个午觉,然后大扫除一下
非安全哥你可不许偷懒哦,紧盯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-22 13:43:10 | 显示全部楼层
464318257 发表于 2017-1-22 13:42
俺现在先去睡个午觉,然后大扫除一下
非安全哥你可不许偷懒哦,紧盯

~~~嘻嘻
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-22 15:13:46 | 显示全部楼层
注意注意!
5> 数组的初始化
然后:

    boy[0] 21.3f;boy[1] = 23.89f;boy[2] = 2.0f;boy[3] = 23f;boy[4] = 778.98f;
其中,boy[0]=21.3f少了一个等号

评分

参与人数 1贡献 +1 收起 理由
零度非安全 + 1 感谢指出,已修正!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-3-20 11:01:37 | 显示全部楼层
很细致的讲解,get
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-4 16:30:46 | 显示全部楼层
008 打卡
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-14 11:07:32 From FishC Mobile | 显示全部楼层
不一般!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-11 20:03:18 | 显示全部楼层
鼓励一下!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-9 13:07:37 | 显示全部楼层
如果想输出 char 型数组的引用,必须让数组 a 和字符串做并置运算。System.out.println("" + a); 这个并置运算是怎么回事,网上没搜到?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-15 20:58:23 | 显示全部楼层
请继续你的讲解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-5 17:25:36 | 显示全部楼层
public class MainClass{
        public static void main(String args[]){
                int a[] = {1,2,3,4};
                int b[] = {100,200,300};
                System.out.println("数组a的元素个数 = " + a.length);
                System.out.println("数组b的元素个数 = " + b.length);
                System.out.println("数组a的引用 = " + a);
                System.out.println("数组b的引用 = " + b);
                System.out.println("a == b 的结果是" + (a == b));
                a = b;
                System.out.println("数组a的元素个数 = " + a.length);
                System.out.println("数组b的元素个数 = " + b.length);
                System.out.println("数组a的引用 = " + a);
                System.out.println("数组b的引用 = " + b);
                System.out.println("a[0] = " + a[0] + ",a[1] = " + a[1] + ",a[2] = " + a[2] + ",a[3] = " + a[3]);
                System.out.println("b[0] = " + b[0] + ",b[1] = " + b[1] + ",b[2] = " + b[2]);
        }
}

F:\abc>java MainClass
数组a的元素个数 = 4
数组b的元素个数 = 3
数组a的引用 = [I@15db9742
数组b的引用 = [I@6d06d69c
a == b 的结果是false
数组a的元素个数 = 3
数组b的元素个数 = 3
数组a的引用 = [I@6d06d69c
数组b的引用 = [I@6d06d69c
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
        at MainClass.main(MainClass.java:15)

运行结果是什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-23 15:40:58 | 显示全部楼层
为啥 a数组和b数组不用初始化new()方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-5 07:55:56 | 显示全部楼层
yulin3192 发表于 2018-5-5 17:25
public class MainClass{
        public static void main(String args[]){
                int a[] = {1,2,3,4};

是不是文件名和类名不统一?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-5 11:39:30 | 显示全部楼层
有没有办法让输入的为自定义的数,而不是随机数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 20:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表