1.1.1 数组的概述
数组(Array)是相同数据类型的数据的有序集合。
数组顾名思义就是数据的排列组合构成的,有一定的排列次序,具有相同数据类型的“组”。
这些“组”就是一个集合,里面包含的一个个数据我们称之为元素。
数组有三个特点
1.我们在定义了一个数组之后,其长度便确定了。
2.在定义数组的时候,也定义了数组的数据类型。这个数据类型就是数组里面的元素的数据类型,这是该数组中只允许出现的数据类型。
3.一个数组是有确定的顺序的,而且可以通过每个元素的下标/索引定位该元素。
1.1.2 内存空间分类(C)
内存分为两类:
栈(stack)内存:基本数据类型分配在栈内存,栈内存空间不需要开发者回收,系统会自动回收。栈空间占整个内存空间的比例较小。
堆(heap)内存:引用数据类型分配在堆内存,堆内存一定要开发者通过new 来申请,同样的我们申请的内存使用完之后也需要释放内存。就像C++那样每使用完一次,就需要释放一次。Java有一个回收机制帮我们做了这件事,而Java的强大之处也在于此。堆空间占整个内存空间的比例较大。
1.2 数组的声明
声明数组有两种方式
数据类型[] 变量 -–>推荐写法
数据类型 变量[]
案例:声明一个数组申请空间并赋值
public class Test01{
public static void main(String[] args){
// 声明一个数组
// int arr[];
int a;
// 【1】声明数组变量
int[] arr;
// 【2】给数组变量分配空间
// 给arr申请了5个连续的整形的int空间。
arr = new int[5];
// 【3】给每个空间赋值
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
arr[3] = 40;
arr[4] = 50;
// 【4】访问元素
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
// System.out.println(arr[5]);(访问元素超过数组长度会出现报错)
}
}
1.2.1 数组的内存空间
1.2.2 数组声明的其他方式
标准的声明和赋值方法过于复杂,可以使用简写的方式
数据类型[] arr = new int[]{值1,值2,…}
jvm根据后面值的个数申请空间并把值赋值到对于空间。
值声明
int[] arr2;
arr2 = new int[]{10,20,30,40,50};
数组的字面量声明
int[] arr = {10,20,30,40,50};
1.3 数组的常用算法
1.3.1 插入算法
在一个数组中我们通常需要插入一个元素
插入元素,那我们首先就需要多出一个内存空间。否则,插入的元素会把数组中原有的元素覆盖掉,这就不叫插入了应该叫替换。所以,我们会在数组的下标最大的元素后面多申请一个内存空间。然后,用插入的这个元素后面称这个数为A和数组中的元素进行大小的比较。当发现,有一个元素的值比A大时。我们就把这个元素的地址定义为A应该放到的地址。然后从数组中最大值开始依次向后填补空白的内存。即Amax赋值到申请的内存空间,后一个元素又填补Amax的空白。我们便得到了一个插入A之后的有序数组。这是当A的值在Amin与Amax之间的情况。若A大于Amax时则把A赋值到申请的内存空间里。
1.3.2 删除算法
一个有序的数组,删除一个元素后依然有序。
在一个数组当中我们需要删除某一个元素,该怎么办呢?
首先,我们可以把这个数找出来。就是通过定义一个变量时这个变量的值等于我们所要删除的这个元素的值。然后,让这个数对每一个元素都进行比较。当这两个数相等时,我们便找到了这个数的位置,和其对应的索引/下标了。再结合前面的插入算法/插入算法用的是元素地址依次向后排列从而把数组按顺序进行排列。而删除算法则相反,用元素地址依次减小从而向前,依次填充空位。
1.3.3 冒泡排序算法
我们来对一个无序数组进行排序
首先我们先确定好思路。我们可以通过拿第1个数简称为a1,从a1开始的每一个数都与两两进行比较。若a1大于后面的某一个数则,让a1与其交换位置。循环到最后一个数时,我们便确定了这一组数据的元素中的最大值的位置。再经过多次循环,每次确定一个数的位置,最终排列出整个数列的顺序。