Java、C、C++中的数组的比较
2015-04-12 20:53
337 查看
数组是一个很常用的数据类型,在不同的语言中它既有相似点又有各个语言所特有的地方,下面是个人对于数组的一些理解:
相同点:
1、不管是在C/C++或是Java中,数组都是相同类型的数据集合,虽然在面向对象语言中,由于类之间的继承的关系,让一个数组中可能存有看似不同的数据类型,但是注意本质上它们都是继承自同一个类型即数组的类型的(例如:对于一个水果数组:数组中的值可能有苹果、香蕉、葡萄。。。但是它们都是继承自水果,即本质上还是同一个数据类型);
2、数组一旦初始化完成,在内存中的空间将被固定,数组长度不可改变,即使将数组全部清空,其长度还是不变;
3、均可静态初始化和动态初始化:
静态初始化:显式指定数组元素值,有系统决定数组长度;e.g.int[] a = {1,2,3} or int [] a = new int[]{1,2,3};
动态初始化:显式指定数组元素的个数,有系统为其提供初始值;
4、数组名代表数组的地址,但是元素的地址就因不同语言而不同了==
不同:
在C和C++中,因为有指针的使用,所以对于数组我们经常将数组和指针结合起来使用,数组名代表这数组的起始地址即第一个数组元素存放的地址,之后每隔从数组名的地址后将上数据类型的长度*n就能得到第n个元素的地址,这个的使用很方便,通常能帮助我们计算出数组数据类型的长度。
如果数组中存放的是引用,那么从数组名开始向上每个元素中存放的就是引用的地址,这些是连续的;
Java中的数组:
Java中数组不单单是一个数据的集合,它本质上是一种引用类型,他定义的变量是一个引用变量,引用变量存放于内存栈中,值为其引用的对象的在堆内存中的地址;在定义后仅表示为一个引用变量,没有有效的内存,所以定义是不能指定数组的长度,(而C可以,在定义时指定长度,但是如若不初始化其值就不确定),在使用时也是,如果没有初始化数组就为其赋值就会引起空指针异常;
还有引用的对象类型既可以是基本数据类型也可以是引用类型,只是引用类型的话,数组元素的值还是对象的引用,要使用其值还任需要为每个元素new一个对象,否则初始化后他们的值均为null,使用时还是会引起空指针异常,也就是说引用类型的数组需要两次初始化,内存栈中数组名指向内存堆中的引用类型的元素,而每个元素又指向真正的对象;
Java中的二维数组:
由上分析,数组是一种引用类型,所以,二维数组本质上应该是一个数组元素的引用指向一维数组的一维数组==
type[][] = new type[len][];即为一个类型为type[]的一维数组,我们初始化了len个一维数组类型为type[],具体每个type[]还需要后续的初始化
数组的循环:
java中可以用foreach循环数组而不用知道数组的长度,但是foreach是不能改变数组元素的值;
数组名表示的是该数组在栈内存中的地址,数组元素的地址是在堆中,不会像C一样通过数组名向上即可得到元素的地址==
还有不全的地方希望大家多指教==
相同点:
1、不管是在C/C++或是Java中,数组都是相同类型的数据集合,虽然在面向对象语言中,由于类之间的继承的关系,让一个数组中可能存有看似不同的数据类型,但是注意本质上它们都是继承自同一个类型即数组的类型的(例如:对于一个水果数组:数组中的值可能有苹果、香蕉、葡萄。。。但是它们都是继承自水果,即本质上还是同一个数据类型);
2、数组一旦初始化完成,在内存中的空间将被固定,数组长度不可改变,即使将数组全部清空,其长度还是不变;
3、均可静态初始化和动态初始化:
静态初始化:显式指定数组元素值,有系统决定数组长度;e.g.int[] a = {1,2,3} or int [] a = new int[]{1,2,3};
动态初始化:显式指定数组元素的个数,有系统为其提供初始值;
4、数组名代表数组的地址,但是元素的地址就因不同语言而不同了==
不同:
在C和C++中,因为有指针的使用,所以对于数组我们经常将数组和指针结合起来使用,数组名代表这数组的起始地址即第一个数组元素存放的地址,之后每隔从数组名的地址后将上数据类型的长度*n就能得到第n个元素的地址,这个的使用很方便,通常能帮助我们计算出数组数据类型的长度。
如果数组中存放的是引用,那么从数组名开始向上每个元素中存放的就是引用的地址,这些是连续的;
Java中的数组:
Java中数组不单单是一个数据的集合,它本质上是一种引用类型,他定义的变量是一个引用变量,引用变量存放于内存栈中,值为其引用的对象的在堆内存中的地址;在定义后仅表示为一个引用变量,没有有效的内存,所以定义是不能指定数组的长度,(而C可以,在定义时指定长度,但是如若不初始化其值就不确定),在使用时也是,如果没有初始化数组就为其赋值就会引起空指针异常;
还有引用的对象类型既可以是基本数据类型也可以是引用类型,只是引用类型的话,数组元素的值还是对象的引用,要使用其值还任需要为每个元素new一个对象,否则初始化后他们的值均为null,使用时还是会引起空指针异常,也就是说引用类型的数组需要两次初始化,内存栈中数组名指向内存堆中的引用类型的元素,而每个元素又指向真正的对象;
Java中的二维数组:
由上分析,数组是一种引用类型,所以,二维数组本质上应该是一个数组元素的引用指向一维数组的一维数组==
type[][] = new type[len][];即为一个类型为type[]的一维数组,我们初始化了len个一维数组类型为type[],具体每个type[]还需要后续的初始化
数组的循环:
java中可以用foreach循环数组而不用知道数组的长度,但是foreach是不能改变数组元素的值;
数组名表示的是该数组在栈内存中的地址,数组元素的地址是在堆中,不会像C一样通过数组名向上即可得到元素的地址==
还有不全的地方希望大家多指教==
相关文章推荐
- C#、Java、C、C++初始化数组过程和比较
- (总结)C++与java比较教程--7.2 C++中声明指针类型和指针数组(待补充)
- C++和Java动态数组比较
- C++和Java函数传递数组参数比较
- c++与Java中继承关系对成员访问权限的影响之比较
- java与C++之比较
- Java 和 C/C++ 中的++的比较
- C#,C++,Java比较
- C++、Java和C#的特性比较
- C++与Java语法比较
- Java数组与C/C++数组的区别
- C# 与 C 、 C++ 、 D 、 Java 的性能比较(三)
- JAVA的Interface观念与C++多重继承的比较
- Java中数组之间的比较
- C#与C++、Java之比较概览
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- Java 与 c 及c++的比较
- c/c++ c++ java 语言与工具 性能比较
- c++ 与java引用比较
- C++、Java和C#的特性比较