数组
数组结构的标准存储方式,是连续的空间,且相同的数据类型,只有这样,数组才能实现根据下标的快速房访问。但是在一些编程语言中,数组不一定是连续的,也不一定是相同类型的。数组还有可能是变长的,二位数组长度还有可能不相等。
编程语言,在实现数组结构时,会根据编程语言自身特点,对数组结构进行了相应的调整。
标准数组结构
标准数组结构:
- 是连续的空间,且相同的数据类型。
- 二维数组,先按行再按列的方式,依次存储在连续的空间中。
- 二维数组a[n][m]寻址公式
address_a[i][j]=address_base+(i*m+j)*data_size
一、C/C++中数组的实现方式
C/C++中实现的数组,完全符合数据结构中的数组的标准定义,是利用一块连续的空间存储相同类型的数据。不论是基本数据类型,还是结构体、对象在数组中都是连续存储的。
基本数据类型数组存储结构
int arr[3];
arr[0]=0;
arr[1]=1;
arr[2]=2;
C/C++中基本类型数组的存储结构
对象(结构体)类型数组的存储结构
// 结构体定义
struct Dog{
char a;
char b;
}
//数组定义
struct Dog arr[3];
arr[0].a='0';
arr[0].b='1';
arr[1].a='2';
arr[1].b='3';
arr[2].a='4';
arr[2].b='5';
C/C++中对象数组的存储格式
二维数组的存储结构
C/C++中,二维数组的存储结构,与数据结构的二维数组的存储方式一致。
// 结构体定义
struct Dog{
char a;
char b;
}
//数组定义
struct Dog arr[3][2];
C/C++中二维数组的存储格式
二、JAVA中数组的实现方式
java中,数组本身的引用存在栈中,具体的对象存在堆内存中。java中数组的实现,并没有完全参照数组结构的定义。
基本数据类型数组存储结构
JAVA中基本数据类型数组,符合数据结构中数组的定义,数组的元素类型相同,且存储在连续的空间之中。
int arr[] = new int[2];
arr[0]=0;
arr[1]=1;
arr[2]=2;
JAVA中基本数据类型数组存储方式
对象类型数组的存储结构
- JAVA中,对象数组的存储结构,已经和数据结构的数组不一致了。
- java的数组中,保存的是数组元素对象的引用地址而非对象本身,而具体对象则散落在堆中(不连续存储)。
//定义类
public class Person{
private String name;
public Person(String name){
this.name=name;
}
}
//定义数组
Person arr[] =new Person[];
arr[0] = new Person("Perter");
arr[1] = new Person("boss");
arr[2] = new Person("sandi");
java对象数组的存储格式
二维数组的存储结构
- java的二维数组的结构,与数据结构数组的结构差别很大。
- java中二维数组的长度都可以是不相同的。
//定义基本类型二维数组
int arr[][] = new int[3][];
arr[0][]=new int[1];
arr[1][]=new int[2];
arr[2][]=new int[3];
//定义对象的二维数组
Person arr[][] =new Person[3][];
arr[0] = new Person[1];
arr[1] = new Person[2];
arr[2] = new Person[3];
arr[0][0]=new Person("思琪");
arr[1][1]=new Person("陶");
java基本类型二维数组的存储结构
java对象类型二维数组的存储结构
三、JavaScript中数组的实现方式
javascript中的数组,和数据结构数组的对比下已经是面目全非了。基本上可以认为只是名字叫数组,与数据结构中的数组几乎没有关系。
javascript中数组的特性
- 可以存储不同类型的数据
- 支持变长数组
- 数据不一定连续存储
不同的数据类型,不同的存储方式
情况1 不同的数据类型: 如果数组中存储的是不同的数据类型的数据,那么javascript会使用类似哈希表的结构,来存储数据。数据并不是连续存储在内存中的。
情况1 相同的数据类型: javascript真的会使用数据结构中的数组来实现,分配一块儿连续的内存空间来存储数据。但是如果向一个相同的数据类型的数组中,插入一个其他的类型的数据,那么javascript就会将底层的存储结构,由数组变为哈希表。
符合数组数据结构的数组 ArrayBuffer
JavaScript给底层应用的开发者,提供了ArrayBuffer这一数据类型,底层的存储结构完全符合数据结构数组的定义。分配连续的内存空间,存储相同的类型的数据。