数组

数组结构的标准存储方式,是连续的空间,且相同的数据类型,只有这样,数组才能实现根据下标的快速房访问。但是在一些编程语言中,数组不一定是连续的,也不一定是相同类型的。数组还有可能是变长的,二位数组长度还有可能不相等。
编程语言,在实现数组结构时,会根据编程语言自身特点,对数组结构进行了相应的调整。

标准数组结构

标准数组结构:

  1. 是连续的空间,且相同的数据类型。
  2. 二维数组,先按行再按列的方式,依次存储在连续的空间中。
  3. 二维数组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++中基本类型数组的存储结构

Android 数组存储 数组储存方式_Android 数组存储

对象(结构体)类型数组的存储结构

// 结构体定义
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++中对象数组的存储格式

Android 数组存储 数组储存方式_java_02

二维数组的存储结构

C/C++中,二维数组的存储结构,与数据结构的二维数组的存储方式一致。

// 结构体定义
struct Dog{
	char a;
    char b;
}
//数组定义
struct Dog arr[3][2];

C/C++中二维数组的存储格式

Android 数组存储 数组储存方式_数据结构_03


二、JAVA中数组的实现方式

java中,数组本身的引用存在栈中,具体的对象存在堆内存中。java中数组的实现,并没有完全参照数组结构的定义。

基本数据类型数组存储结构

JAVA中基本数据类型数组,符合数据结构中数组的定义,数组的元素类型相同,且存储在连续的空间之中。

int arr[] = new int[2];
arr[0]=0;
arr[1]=1;
arr[2]=2;

JAVA中基本数据类型数组存储方式

Android 数组存储 数组储存方式_java_04

对象类型数组的存储结构

  • 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对象数组的存储格式

Android 数组存储 数组储存方式_java_04

二维数组的存储结构

  • 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基本类型二维数组的存储结构

Android 数组存储 数组储存方式_数据结构_06


java对象类型二维数组的存储结构

Android 数组存储 数组储存方式_java_07


三、JavaScript中数组的实现方式

javascript中的数组,和数据结构数组的对比下已经是面目全非了。基本上可以认为只是名字叫数组,与数据结构中的数组几乎没有关系。

javascript中数组的特性

  • 可以存储不同类型的数据
  • 支持变长数组
  • 数据不一定连续存储

不同的数据类型,不同的存储方式

情况1 不同的数据类型: 如果数组中存储的是不同的数据类型的数据,那么javascript会使用类似哈希表的结构,来存储数据。数据并不是连续存储在内存中的。
情况1 相同的数据类型: javascript真的会使用数据结构中的数组来实现,分配一块儿连续的内存空间来存储数据。但是如果向一个相同的数据类型的数组中,插入一个其他的类型的数据,那么javascript就会将底层的存储结构,由数组变为哈希表。

符合数组数据结构的数组 ArrayBuffer

JavaScript给底层应用的开发者,提供了ArrayBuffer这一数据类型,底层的存储结构完全符合数据结构数组的定义。分配连续的内存空间,存储相同的类型的数据。