JAVA..数组

来源:互联网 发布:qemu运行arm linux 编辑:程序博客网 时间:2024/05/03 15:13

正在努力学习JAVA中。。。

JAVA数组问题:上网上搜索了一些相关的= =!


数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来唯一地确定数组中的元素。
1. 一维数组

1.1 一维数组的定义

type arrayName[];
type[] arrayName;

其中类型(type)可以为Java中任意的数据类型,包括简单类型组合类型,数组名arrayName为一个合法的标识符,[]指明该变量是一个数组类型变量。

第二种形式对C++开发者可能觉得很奇怪,不过对JAVA或C#这样的开发语言来说,
第二种形式可能更直观,因为这里定义的只是个变量而已,
系统并未对其实例化,只需指明变量的类型即可,也不需在[]指定数组大小。(第一种形式是不是只是为了兼容以前的习惯,毕竟C语言的影响太大了?)

例如:
int intArray[];

声明了一个整型数组,数组中的每个元素为整型数据。与C、C++不同,
Java在数组的定义中并不为数组元素分配内存,因此[]中不用指出数组中元素个数,

即数组长度,而且对于如上定义的一个数组是不能访问它的任何元素的。

我们必须为它分配内存空间,这时要用到运算符new,其格式如下:
arrayName=new type[arraySize];

其中,arraySize指明数组的长度。如:
intArray=new int[3];
为一个整型数组分配3个int型整数所占据的内存空间。


通常,这两部分可以合在一起,格式如下:
type arrayName=new type[arraySize]; 

例如:
int intArray=new int[3];

1.2 一维数组元素的引用
定义了一个数组,并用运算符new为它分配了内存空间后,就可以引用数组中的每一个元素了。数组元素的引用方式为:
arrayName[index]

其中:index为数组下标,它可以为整型常数或表达式。如a[3],b[i](i为整型),
c[6*I]等。下标 从0开始,一直到数组的长度减1。对于上面例子中的intArray数来说,它有3个元素,分别为: 

intArray[0],intArray[1],intArray[2]。注意:没有intArray[3]。

另外,与C、C++中不同,Java对数组元素要进行越界检查以保证安全性。
同时,对于每个数组都有一个属性length指明它的长度,例如:intArray.length指明数组intArray的长度。


public class ArrayTest{  
    public static void main(String args[]){  
        int i;  
        int a[]=new int[5];  
        for(i=0;i<5;i++)  
            a[i]=i;  
        for(i=a.length-1;i>=0;i--)  
            System.out.println("a["+i+"]="+a[i]);  
    }  
}  

运行结果如下:

a[4]=4
a[3]=3
a[2]=2
a[1]=1
a[0]=0


该程序对数组中的每个元素赋值,然后按逆序输出。

1.3 一维数组的初始化
对数组元素可以按照上述的例子进行赋值。也可以在定义数组的同时进行初始化。

例如:

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

用逗号(,)分隔数组的各个元素,系统自动为数组分配一定空间。

与C中不同,这时Java不要求数组为静态(static),其实这里的变量类似C中的指针,
所以将其作为返回值给其它函数使用,仍然是有效的,在C中将局部变量返回给调用函数继续使用是初学者很容易犯的错误。

2. 多维数组
与C、C++一样,Java中多维数组被看作数组的数组。例如二维数组为一个特殊的一维数组,
其每个元素又是一个一维数组。下面我们主要以二维数为例来进行说明,高维的情况是类似的。

2.1 二维数组的定义
二维数组的定义方式为:
type arrayName[][];

例如:
int intArray[][];

与一维数组一样,这时对数组元素也没有分配内存空间,同要使用运算符new来分配内存,然后才可以访问每个元素。

对高维数组来说,分配内存空间有下面几种方法:
1. 直接为每一维分配空间,如:
int a[][]=new int[2][3];

2. 从最高维开始,分别为每一维分配空间,如:
int a[][]=new int[2][];
a[0]=new int[3];
a[1]=new int[3];

完成1中相同的功能。这一点与C、C++是不同的,在C、C++中必须一次指明每一维的长度。

2.2 二维数组元素的引用
对二维数组中每个元素,引用方式为:arrayName[index1][index2] 其中index1、index2为下标,可为整型常数或表达式,如a[2][3]等,同样,每一维的下标都从0开始。

2.3 二维数组的初始化
有两种方式:
1. 直接对每个元素进行赋值。
2. 在定义数组的同时进行初始化。

如:int a[][]={{2,3},{1,5},{3,4}};
定义了一个3×2的数组,并对每个元素赋值。




如果你熟悉C/C++Java数组的工作原理与它们不同。Java中的数组是对象,这就意味着与C++中的数组的根本不同.


1数组不是集合,它只能保存同种类型的多个原始类型或者对象的引用

数组保存的仅仅是对象的引用,而不是对象本身。

数组声明的两种形式:一、int[] arr;二、int arr[]; 推荐使用前者,这是一个int数组对象,而不是一个int原始类型。


2、数组本身就是对象,Java中对象是在堆中的,

因此数组无论保存原始类型还是其他对象类型,数组对象本身是在堆中的


3在数组声明中包含数组长度永远是不合法的!如:int[5] arr;

因为,声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM(JAVA虚拟机)才分配空间,这时才与长度有关。


4、在数组构造的时候必须指定长度,因为JVM要知道需要在堆上分配多少空间。例:int[] arr = new int[5];


5、一维数组的构造。形如:String[] sa = new String[5]; 或者分成两句:String[] sa; sa = new String[5];


6、原始类型数组元素的默认值。对于原始类型数组,在用new构造完成而没有初始化时,JVM自动对其进行初始化。默认值:byteshort intlong--0 float--0.0f double--0.0 boolean--false char--'"u0000'。(无论该数组是成员变量还是局部变量)


7对象类型的数组虽然被默认初始化了,但是并没有调用其构造函数。也就是说:Car[] myCar = new Car[10];只创建了一个myCar数组对象!并没有创建Car对象的任何实例!


8、多维数组的构造。float[][] ratings = new float[9][]; 第一维的长度必须给出,其余的可以不写,因为JVM只需要知道赋给变量ratings的对象的长度。


9、数组索引的范围。数组中各个元素的索引是从0开始的,到length-1。每个数组对象都有一个length属性,它保存了该数组对象的长度。(注意和String对象的length()方法区分开来)


10Java有数组下标检查,当访问超出索引范围时,将产生ArrayIndexOutOfBoundsException运行时异常。注意,这种下标检查不是在编译时刻进行的而是在运行时!也就是说int[] arr = new int[10]; arr[100] = 100; 这么明显的错误可以通过编译,但在运行时抛出!

Java中的数组中既可以存储基本的值类型,也可以存储对象。对象数组和原始数据类型数组在使用方法上几乎是完全一致的,唯一的差别在于对象数组容纳的是引用而原始数据类型数组容纳的是具体的数值。在讨论关于数组的问题时,一定要先确定数组中存储的是基本值类型还是对象。特别是在调试程序时,要注意这方面。



引用自:http://blog.csdn.net/seadplus/article/details/7447335

http://blog.csdn.net/szmorson/article/details/6154304


原创粉丝点击