数组简介
用一句话说明,数组就是存放在连续内存空间上的相同类型数据的集合。数组可以轻松通过下标获取到下标对应的数据。 下面举一个字符数组的例子:
由此可以看出:
- 数组的下标都是由0开始的。
- 数组内存空间的地址是连续的。
由于数组在内存空间中的地址是连续的特性,我们在增加或者删除数组中的元素时,数组中的元素的地址发生改变就是不可避免的。例如我们删除数组中的某个下标为3的元素,下标为大于3的所有的数组元素都要做移动的操作。
由此可知,数组中的元素是不能删除的,只能覆盖。
二维数组简介
之前我们说过一维数组在内存地址中是连续的,那么二维数组在内存中是连续的吗? 一般来说,不同的编程语言在内存管理上的方式是有差别的,例如GO语言中的二维数组在内存地址中就是连续的, 以下是测试代码:
package main
import "fmt"
func testArr() {
array := [2][3]int{
{0, 1, 2},
{3, 4, 5},
}
fmt.Printf("%p %p %p\n", &array[0][0], &array[0][1], &array[0][2])
fmt.Printf("%p %p %p\n", &array[1][0], &array[1][1], &array[1][2])
}
func main() {
testArr()
}
//运行结果
0x7ffee4065820 0x7ffee4065824 0x7ffee4065828
0x7ffee406582c 0x7ffee4065830 0x7ffee4065834
由于本次示例的二维数组保存的数据类型为int类型,如果地址是相邻的,那么他们的地址应该是以4为间隔数。由此可知,是连续的。
而类似java语言是没有指针的,同时也不对程序员暴露其元素的地址,寻址完全依赖虚拟机。 如下是Java的示例代码
public static void test_arr() {
int[][] arr = {{1, 2, 3}, {3, 4, 5}, {6, 7, 8}, {9,9,9}};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
}
//运行结果
[I@7852e922
[I@4e25154f
[I@70dea4e
[I@5c647e05
从运行后的结果可以看到Java的元素的地址并非真正的内存地址,是经过处理后的16进制数,而且也没有任何的规律。 所以,java的二维数组的排列方式可能是这样的