数组
在计算机中每一种算法都必定对应一种数据结构,而数组是所有数据结构中最简单也是最基本的数据结构。。。。
在计算机中数组数据结构,简称数组(Array),是由相同类型的元素(element)的集合所组成的数据结构,是一块连续的内存来存储。因为是连续的,所以利用元素的索引(index)可以计算出该元素对应的存储地址
数组结构解析
一维数组的抽象表示
数组的特性(与链表这种数据结构刚好相反)
- 请求空间以后大小固定,不能再改变(数据溢出问题);
- 在内存中是连续存储的,因为中间不会存在其他程序需要调用的数据,所以数组的专用内存空间;
多维数组初始化
1维数组
int[] arr = {1,1,5};
int[] arr2 = new int[3];
2维数组
int[][] arr = {{1,1,5},{1,1,1}};
int[][] arr2 = new int[3][];
arr2[0] = new int[3];
arr2[1] = new int[3];
arr2[2] = new int[3];
多维数组
数据类型 多个[] 变量 = 多个{}嵌套
举个三维数组的例子
int[][][] arr = {
{
{1,2,2},{1,2},{1}
},
{
{1},{1},{1,2},{2}
}
};
编程实现
我们所用的所有数据结构都离不开增、删、改、查,所以从这四个方面思考实现即可。。。。‘
增加
实现思路:传入数组下标和需要添加的元素,用for循环将指定位置后的所有元素后移一位,之后再将对应下标位置的元素进行替换即可。
如[5,7,8,0,0,0,0]这是一个长度为7元素个数size为3的数组,传入add(1,4);
执行循环得[5,7,7,8,0,0,0]
public void add(int index, int element) {
for (int i = size - 1; i >= index; i--) {
arr[i + 1] = arr[i];//执行循环将需要添加的数字向后移
}
arr[index] = element;//添加
size++;//添加成功之后增加数组的长度
}
当然这个是可以自由扩展的,这种添加一般不常用所以演化出了只在开头添加和只在结尾添加的两种常用方法。。。
只在开头添加元素
public void addFirst(int element) {
add(0, element);
}
只在结尾处添加
public void addLast(int element) {
add(size, element);
}
修改
传入下标修改
public void set(int index, int element) {
arr[index] = element;
}
查询
查询时只需要传入下标即可获得元素
public int get(int index) {
return arr[index];
}
这种查询也是不经常使用,最常用的一般是查询一个数组是否存在某个元素与传入某个元素查询其对应下标。。。。
查询数组是否存在某个元素
public boolean contains(int element) {
for (int i = 0; i < size; i++) {
if (arr[i] == element) {
return true;
}
}
return false;
}
传入元素获得对应下标
public int find(int element) {
for (int i = 0; i < size; i++) {
if (arr[i] == element) {
return i;
}
}
return -1;//如果没有返回-1
}
删除
将指定索引处的后面的元素向前移动一位
如[5,7,8,0,0,0,0]传入remove(1)
执行循环得[5,8,8,0,0,0]
public int remove(int index) {
int element = arr[index];
arr[index] = 0;
for (int i = index + 1; i < size; i++) {
arr[i - 1] = arr[i];
}
size--;
return element ;
}
更常用的也是直接删除最后一个或第一个元素,还有传入对应元素进行删除这几种比较常用的方法。。。
删除第一个元素
public int removeFirst() {
return remove(0);
}
删除最后一个元素
public int removeLast() {
return remove(size - 1);
}
传入元素进行删除
public void removeElement(int e) {
int index = find(e);//上面查询的方法它返回的是下标
if (index != -1) remove(index);
}
这里简要说明了实现思路和流程如果想要具体实现可参考
链接: 手写数组的底层实现(java实现).