【Java 教程(原创)】008.Java的数组(上)
本帖最后由 零度非安全 于 2017-1-22 15:36 编辑【Java 教程(原创)】索引帖
数组是相同类型的变量按顺序组成的一种复合数据类型,这些相同类型的变量称为数组的元素或单元。数组通过数组名加索引来使用数组的元素,索引从 0 开始。
1>数组的声明
声明数组包括声明数组的名字、数组元素的数据类型。
声明一维数组有下列两种格式:
数组的元素类型 数组名字[];
数组的元素类型[] 数组名字;声明二维数组有下列两种格式:
数组的元素类型 数组名字[][];
数组的元素类型[][]数组名字;例如:
float boy[];
char cat[][];那么数组 boy 的元素可以存放 float 型数据,数组 cat 的元素可以存放 char 型数据。
数组的元素类型可以是 Java 中的任一种类型。假如已经声明一种 People 类型数据,那么可以如下声明一个数组:
People china[];将来数组 china 的元素可以存放 People 类型的数据。
注:与 C/C++ 不同,Java 不允许在声明数组中的方括号内指定数组元素的个数。若声明:
int a或
int a将导致语法错误。
2>数组的创建
声明数组仅仅是给出了数组名字和元素的数据类型,要想真正使用数组还必须为它分配内存空间,即创建数组。
为数组分配内存空间的格式如下:
数组名字 = new 数组元素的类型[数组元素的个数];例如:
boy = new float;为数组分配内存空间后,数组boy获得 4 个用来存放 float 类型数据的内存空间,即 4 个 float 型元素。数组变量 boy 中存放着这些内存单元的首地址,该地址称为数组的引用,这样数组就可以通过索引操作这些内存单元。数组属于引用型变量,数组变量中存放着数组的首元素地址,通过数组名加索引使用数组的元素,例如:
boy = 12;
boy = 23.901F;
boy = 100;
boy = 10.23f;内存分配示意图如下:
声明数组和创建数组可以一起完成,例如:
float boy[] = new float;二维数组和一维数组一样,在声明之后必须用 new 运算符分配内存空间,例如:
int mytwo[][];
mytwo = new int;或
int mytwo[][] = new int;Java采用“数组的数组”声明多维数组,一个二维数组是由若干个一维数组构成的。例如:上述创建的二维数组 mytwo 就是由 3 个长度为 4 的一维数组 mytwo、mytwo 和 mytwo 构成的。
构成二维数组的一维数组不必有相同的长度,在创建二维数组时可以分别指定构成该二维数组的一维数组的长度,例如:
int a[][] = new int[];创建了一个二维数组 a,a 由3个一维数组 a、a 和 a构成,但它们的长度还没有确定,即这些一维数组还没有分配内存空间,所以二维数组 a 还不能使用,必须创建它的3个一维数组。例如:
a = new int;
a = new int;
a = new int;注:和 C 语言不同的是,Java允许使用 int 型变量的值指定数组元素的个数。例如:
int size = 30;
double number[] = new double;
3> 数组元素的使用
一维数组通过索引符访问自己的元素,如 boy、boy等。需要注意的是,索引从 0 开始,因此,数组若有 7 个元素,那么索引到 6 为止。如果程序使用了如下语句:
boy = 384.98f;程序可以编译通过,但运行时将发生 ArrayIndexOutOfBoundsException 异常,因此,用户在使用数组时必须谨慎,防止索引越界。
二维数组也通过索引符访问自己的元素,如 a、a 等。需要注意的是,索引从 0 开始,例如声明创建了一个二维数组 a:
int a[][] = new int;那么第一个索引的变化范围是从 0 到 1,第二个索引的变化范围从 0 到 2。
4> length的使用
数组的元素的个数称为数组的长度。对于一维数组,“数组名字.length”的值就是数组中元素的个数;对于二维数组,“数组名字.length”的值是它含有的一维数组的个数。例如,对于:
float a[] = new float;
int b[][] = new int;a.length 的值是 12,b.length 的值是3。
5> 数组的初始化
创建数组后,系统会给每个数组元素一个默认的值,例如,float 型是 0.0。
在声明数组的同时也可以给数组的元素一个初始值,例如:
float boy[] = {21.3f,23.89f,2.0f,23f,778.98f};上述语句相当于:
float boy[] = new float;然后:
boy = 21.3f;boy = 23.89f;boy = 2.0f;boy = 23f;boy = 778.98f;也可以直接用若干个一维数组初始化一个二维数组,这些一维数组的长度不尽相同,例如:
int a[][] = {{1},{1,1,},{1,2,1},{1,3,3,1},{1,4,6,4,1}};
6> 数组的引用
相信大多数鱼油已经知道,数组属于引用型变量,因此,两个相同类型的数组如果具有相同的引用,它们就有完全相同的元素。例如,对于:
int a[] = {1,2,3},b[] = {4,5};数组 a 和 b 中分别存放着引用 0x35ce36 和 0x757aef,内存模型如下图所示:
如果使用了下列赋值语句(a 和 b 的类型必须相同):
a = b那么,a 中存放的引用和 b 的相同,这时系统将释放最初分配给数组 a 的元素,使得 a 的元素和 b 的元素相同,a 、b 的内存模型变成如下图所示:
下面的例子使用了数组,运行效果如下图所示:
例子代码如下:
simpleArrayUse.java
public class simpleArrayUse{
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 == b 的结果是" + (a == b));
System.out.println("a = " + a + ",a = " + a + ",a = " + a);
System.out.print("b = " + b + ",b = " + b + ",b = " + b);
}
}需要注意的是,对于 char 型数组 a,System.out.println(a) 不会输出数组 a 的引用,而是输出数组 a 的所有元素的值。例如,对于:
char a[] = {'A','你','好','呀'};System.out.println(a) 的输出结果是:
A你好呀如果想输出 char 型数组的引用,必须让数组 a 和字符串做并置运算。例如:
System.out.println("" + a);其输出结果是数组的引用。
在数组的下集中会讲下Java数组的复制。{:10_281:}
【特别注意】贴子中的栗子希望鱼油们能自觉的手动敲上去,不要单纯的复制粘贴保存,然后编译运行。
点我前往上一讲
点我前往下一讲
俺现在先去睡个午觉,然后大扫除一下
非安全哥你可不许偷懒哦,紧盯 464318257 发表于 2017-1-22 13:42
俺现在先去睡个午觉,然后大扫除一下
非安全哥你可不许偷懒哦,紧盯
{:10_256:}~~~嘻嘻 注意注意!{:10_260:}
5> 数组的初始化
然后:
boy 21.3f;boy = 23.89f;boy = 2.0f;boy = 23f;boy = 778.98f;
其中,boy=21.3f少了一个等号 很细致的讲解,get 008 打卡 不一般! 鼓励一下!{:5_95:} 如果想输出 char 型数组的引用,必须让数组 a 和字符串做并置运算。System.out.println("" + a); 这个并置运算是怎么回事,网上没搜到? 请继续你的讲解 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 = " + a + ",a = " + a + ",a = " + a + ",a = " + a);
System.out.println("b = " + b + ",b = " + b + ",b = " + b);
}
}
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)
运行结果是什么意思 为啥 a数组和b数组不用初始化new()方法 yulin3192 发表于 2018-5-5 17:25
public class MainClass{
public static void main(String args[]){
int a[] = {1,2,3,4};
是不是文件名和类名不统一? 有没有办法让输入的为自定义的数,而不是随机数
页:
[1]