01.02 数组基础
数组简介
数组定义
数组(Array):一种线性表数据结构。它使用一组连续的内存空间,来存储一组具有相同类型的数据。
线性表:线性表就是所有数据元素排成像一条线一样的结构,线性表上的数据元素都是相同类型,且每个数据元素最多只有前、后两个方向。数组就是一种线性表结构,此外,栈、队列、链表都是线性表结构。
连续的内存空间:线性表有两种存储结构:「顺序存储结构」和「链式存储结构」。其中,「顺序存储结构」是指占用的内存空间是连续的,相邻数据元素之间,物理内存上的存储位置也相邻。数组也是采用了顺序存储结构,并且存储的数据都是相同类型的。
综合这两个角度,数组就可以看做是:使用了「顺序存储结构」的「线性表」的一种实现方式。
随机访问
数组的一个最大特点是:可以进行随机访问。即数组可以根据下标,直接定位到某一个元素存放的位置。
寻址公式如下:下标 i 对应的数据元素地址 = 数据首地址 + i × 单个数据元素所占内存大小。
多维数组
不同语言实现
在具体的编程语言中,数组这个数据结构的实现方式具有一定差别。
C / C++ 语言中的数组最接近数组结构定义中的数组,使用的是一块存储相同类型数据的、连续的内存空间。不管是基本类型数据,还是结构体、对象,在数组中都是连续存储的。例如:
int arr[3][4] = {{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}};
Java 中的数组跟数据结构定义中的数组不太一样。Java 中的数组也是存储相同类型数据的,但所使用的内存空间却不一定是连续(多维数组中)。且如果是多维数组,其嵌套数组的长度也可以不同。例如:
int[][] arr = new int[3][]{ {1,2,3}, {4,5}, {6,7,8,9}};
原生 Python 中其实没有数组的概念,而是使用了类似 Java 中的 ArrayList 容器类数据结构,叫做列表。通常我们把列表来作为 Python 中的数组使用。Python 中列表存储的数据类型可以不一致,数组长度也可以不一致。例如:
arr = ['python', 'java', ['asp', 'php'], 'c']
基本操作
我使用Java编程语言,数组定义参考博客: Java数组的基本使用,Java数组的5种基本操作,一维数组及数组的增、删、查、改
声明数组
// 1动态初始化(指定长度)
String[] aArray = new String[5];
// 其中元素自动拥有默认值。如果是i整数类型,默认为0;如果是浮点类型,默认0.0;如果是字符类型,默认‘\u0000’;如果是布尔类型,默认false;如果是引用类型,默认null。
// 2静态初始化的标准格式(指定内容,不指定长度,自动推算长度)
String[] bArray = new String[]{"a","b","c","d","e"};
// 3静态初始化的省略格式
String[] cArray = {"a","b","c", "d", "e"};
// 存储在堆中,完全等价于String[] cArray = new String[]{"a","b","c", "d", "e"}
// 动态初始化以及静态初始化的标准格式可以拆分成两个步骤
String[] aArray;
aArray = new String[5];
String[] bArray;
bArray = new String[]{"a","b","c","d","e"};
// 静态初始化的省略模式不可以拆分成两个步骤
// String[] cArray;
// cArray = {"a","b","c","d","e"}; // 错误
2 获取数组的长度(.length)
String[] aArray = new String[5];
int len = aArray.length;
System.out.println(len) //5;
3 打印数组(Arrays.toString(array))
String[] aArray = new String[]{"a","b","c","d","e"};
String aArrayString = Arrays.toString(aArray);
// 直接打印数组名将输出地址
System.out.println(aArray);
// [I@7150bd4d
System.out.println(aArrayString);
// [a, b, c, d, e]
4 数组元素重排序(Arrays.sort())
int[] array1 = {2, 1, 3, 10, 6};
Arrays.sort(array1);
System.out.println(Arrays.toString(array1));// [1, 2, 3, 6, 10]
String[] array2 = {"bbb", "aaa", "ccc"};
Arrays.sort(array2);
System.out.println(Arrays.toString(array2));// [aaa, bbb, ccc]
// 如果是数值,sort默认按升序从小到大;如果是字符串,sort默认按字母升序
5 判断数组中是否包含某个值
String[] aArray = { "a", "b", "c", "d", "e" };
boolean b = Arrays.asList(aArray).contains("a");
System.out.println(b);
// true
Java容器关系示意图: