JAVA基础篇四(Java,C++中的数组)

来源:互联网 发布:青岛学淘宝美工 编辑:程序博客网 时间:2024/05/16 15:47

JAVA里数组的内存分配是在堆里面的,必须用new来分配,而C++里面是在栈里面分配的(除利用指针new出的数组),定义的时候会自动分配。

1、JAVA中的数组

(1)数组不是集合,它只能保存同种类型的多个原始类型或者对象的引用。数组保存的仅仅是对象的引用,而不是对象本身。数组声明的两种形式:一、int[] arr; 二、int arr[];  推荐使用前者,这是一个int数组对象,而不是一个int原始类型。

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

(3)在数组声明中包含数组长度永远是不合法的!如:int[5] arr; 。因为,声明的时候并没有实例化任何对象,只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。

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

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

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

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

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

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

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

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

示列:

一维数组 

1) int[] a; //声明,没有初始化

2) int[] a=new int[5]; //初始化为默认值,int型为0

3) int[] a={1,2,3,4,5}; //初始化为给定值

4) int[] a=new int[]{1,2,3,4,5}; //同(3) int[] a=new int[5]{1,2,3,4,5}; //错误,如果提供了数组初始化操作,则不能定义维表达式

5) int[] a; a=new int[5]; //正确,同(2)一样

int[] a; a={1,2,3,4,5}; //错误,数组常量只能在初始化操作中使用,如(3)

6) int a[]; a[0]=1; //错误,因为数组没有初始化,不能赋值 a[1]=2;

二维数组 

1) int[][] a; //声明,没有初始化

2) int[][] a=new int[2][3]; //初始化为默认值,int型为0

3) int[][] a={{1,2},{2,3},{3,4}}; //初始化为给定值 int[][] a={{1,2},{2,3},{3,4,5}}; //没有错,数组空间不是连续分配的,所以不要求每一维的大小相同

4) int[][] a=new int[2][]; a[0]=new int[3]; //a[0]其实就是一个数组 a[1]=new int[4]; //每一维的大小可以不一样;

5) int[][] a=new int[][]{{1,2},{2,3},{3,4,5}}; //同(3) int[] a=new int[5]{{1,2},{2,3},{3,4,5}}; //错误,如果提供了数组初始化操作,则不能定义维表达式

int[][] a=new int[2][]; a[0]={1,2,3,4,5}; //错误,数组常量只能在初始化操作中使用

6) int[][] a=new int[2][]; a[0][1]=1; //错误,第二维没有初始化,不能赋值,java.lang.NullPointerException异常

总结: 1.二维就是数组的数组,里面的数组大小不要求一样

2.不管一维还是二维,在使用前(赋值,访问)必须初始化,可以用new默认初始化,也可以用数组常量初始化


1.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行; (一般用指针实现动态数组,返回数组首地址)

2.静态初始化:在定义数字的同时就为数组元素分配空间并赋值;

3.默认初始化:数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐士初始化。

1、C++中的数组

C++的数组定义可以分为两种,一种是分配在栈空间上,一种是分配在堆空间上。

如int a[3]这种形式的定义,内存的分配在栈空间完成;

int *a = new int[3],这种形式的内存分配在堆空间完成。

示列:

(1)一维数组的定义与初始化
1)定义一维数组
int a[3];
该定义表示一个整型数组,共有3个元素,下标分别为[0],[1],[2]。
2)一维数组初始化
可以用下面几种方式进行初始化。
①在定义数组时分别对数组元素赋初值。
int a[3]={0,1,2};
②只给一部分元素赋值。
int a[3]={0,1};
这表示只给前面两个元素赋初值,后面的元素值默认为0。
③在对全部数组元素赋初值时,可以不指定数组长度。
int a[3]={0,1,2};
可以写成
int a[]={0,1,2};
在第二种写法中,花括号中有3个元素,系统就会据此自动定义a数组的长度为3。但若被定义的数组长度与提供初值的个数不相同,则数组长度不能省略。

④指针分配数组

int *a = new int[5];
(2)二维数组的定义与初始化
1)定义二维数组
int a[3][4];
改定义表示一个3x4(3行4列)的整型数组。可以把该二维数组看作:
|---a[0]:a[0][0],a[0][1],a[0][2],a[0][3]
a |--a[1] :a[1][0],a[1][1],a[1][2],a[1][3]
|--a[2] :a[2][0],a[2][1],a[2][2],a[2][3]
C++中,二维数组种元素排列的顺序是:按行存放,即在内存中先顺序存放第一行的元素,在存放第二行元素,依次往下。
2)二维数组初始化
可以用下面几种方式进行初始化。
①分行给二维数组赋初值。
int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
②将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。
int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
③只对部分元素赋初值。
int a[3][4]={{1},{2},{4}};
1 0 0 0
2 0 0 0
4 0 0 0
int a[3][4]={{1},{0,2},{0,0,4}};
1 0 0 0
0 2 0 0
0 0 4 0
int a[3][4]={{1},{3,2}};
1 0 0 0
3 2 0 0
0 0 0 0
int a[3][4]={{1},{},{9}};
1 0 0 0
0 0 0 0
9 0 0 0
④如果对全部元素赋初值,则定义数组时对第一维长度可以不指定,但第二维长度必须指定。
int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};
可以写成
int a[][4]={0,1,2,3,4,5,6,7,8,9,10,11};
在定义时也可以对部分元素赋初值而省略第一维的长度,但应分行赋初值。
int a[][4]={{0,0,1},{},{0,9}};
0 0 1 0
0 0 0 0
0 9 0 0

⑤指针分配数组

int **a = new int *[5];

for(int i =0;i<5;i++)

{

a[i] = new int[10];

}

分配5*10的int空间。


参考文献:http://www.cnblogs.com/Yogurshine/archive/2012/12/29/2839238.html

http://blog.csdn.net/SpeedMe/article/details/22925977

1 0
原创粉丝点击