数组
1.1.1 【什么是数组】什么是数组
l 程序=算法+数据结构;
l If、if-else、switch、循环解决的都是流程问题,即算法问题。
l 所谓的数据结构就是把数据按照特定的某种结构来保存,设计合理的数据结构是解决问题的前提。
l 数组就是最基本的一种数据结构。
l 相同数据类型的元素组成的集合
l 元素按线性顺序排列,是指除第一个元素外,每一个元素都有唯一的前驱元素;除最后一个元素外,每一个元素都有唯一的后继元素(一个跟一个)。
l 可以通过元素所在位置的顺序号(下标)做标识来访问每一个元素(下标从0开始,最大到元素个数-1)。
a[0] a[1] a[2] ......a[n-1]
10 23 30 .......
2.2.1【数组的定义】定义基本类型数组
声明数组的语法:
数据类型[ ] 数组名 = new 数据类型[大小(个数)];
int[] arr = new int[10];
要点:
ü 确切的数据类型
ü 整体的数组名字
ü 不可缺少的”[]”
执行new语句才使得数组分配到指定大小的空间。
int[] arr 与int arr[] 两种写法均可。
声明数组时不规定数组长度,new关键字分配空间时需要指定分配空间的大小。
2.3.1【数组的初始化】初始化数组
l 基本类型的数组创建后,其元素的初始值:byte、short、char、int、long为0;float和double为0.0;boolean为false。
l 可以在数组声明的同时对数组的元素进行初始化
int [] arr = {10,23,30,-10,21};元素的个数即为数组的长度
l 此写法只能用于声明时的初始化,不能用于赋值
例如下面代码会编译错误:
int[] arr;
arr = {10,23,30,-10,21};
可以通过下面的方式给已经声明的数组类型变量进行初始化:
int [] arr;
arr = new int[]{10,23,30,-10,21}; []中不可以写长度,元素个数就是数组的长度。
2.4.1【数组的访问】获取数组的长度
调用数组的length属性可以获取数组的长度:
int[] arr = new int[]{3,6,8,9};
int len = arr.length;
System.out.println(“数组长度为:”+len); 数组长度为4
2.4.2【数组的访问】通过下标访问数组元素
int[] arr = new int[]{4,5,6,8};
int temp = arr[2]; //获取第3个元素:6 。
//交换数组下标为2和3的两个相邻元素的值
int temp = arr[2];
arr[2] = arr[3];
arr[3] = temp;
//交换后结果:4,5,8,6
2.4.3【数组的访问】遍历数组元素
通常选择for循环语句,循环变量作为访问数组元素的下标,即可访问数组的每一个元素
int[] arr = new int[10];
for(int i = 0;i<arr.length;i++){
arr[i] = 100;
}
循环计数器的变化范围从0---length-1。
l 遍历数组元素,正序输出:
int[] arr = new int[]{10,20,30,40,50};
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i]);
}
l 遍历数组元素,倒序输出:
int[] arr = new int[]{10,20,30,40,50};
for(int i =(arr.length-1);i>=0;i--){
System.out.println(arr[i]);
}
2.5.1【数组的复制】System.arraycopy方法
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
src -- 源数组
srcPos -- 源数组中的起始位置 int[] a = new int[]{10,20,30,40,50};
dest -- 目标数组 int[] a1 = new int[6];
destPos -- 目标数组中的起始位置 System.arraycopy(a,1,a1,0,4);
length -- 要复制的数组元素的数量
2.5.2【数组的复制】Arrays.copyOf方法
类型[] newArray = Arrays.copyOf(类型[],int newLength);
newLength小于源数组,则进行截取;newLength大于源数组,则用0或null进行填充。
所以产生的新数组可以大于源数组的长度。
int[] a = {10,20,30,40,50};
int[] a1 = Arrays.copyOf(a,6); a1数组元素为:10 20 30 40 50 0
2.5.3【数组的复制】数组的扩容
数组的长度在创建后不可改变,扩容是指创建一个更大的新数组并将原有数组内容复制到其中。
int[] a = {10,20,30,40,50};
a = Arrays.copyOf(a,a.lenth+1);
2.6.1【数组排序】数组排序
l 排序是对数组施加的最常用的算法;
l 所谓排序是指将数组按照从小到大或从大到小的顺序重新排列;
l 对于元素较多的数组,排序算法的优劣至关重要;
l 一般情况下,通过排序过程中数组元素的交换次数来衡量排序算法的优劣;
l 常用排序算法:插入排序、冒泡排序、快速排序等。
2.6.2【数组排序】数组冒泡排序算法
原则:比较相邻的元素,如果违反最后的顺序准则,则交换。
n 第一次找到所以元素中最大的放在最后一个位置上,不再变动;
n 第二次找到剩余所以元素中最大的放在倒数第二个位置上,不再变动;
n 以此类推,直到排序完成。
比较时可以采用‘下沉’方法,也可以使用‘上浮’方法。
2.6.3【数组排序】Arrays.sort方法用于数组排序
int[] arr = {49,81,1,64,77,50,0,54,77,18};
Arrays.sor(arr);
for(int i = 0;i<arr.length;i++){
System.out.println(arr[i]); // 0 1 18 49 50 54 64 77 77 81
}
案例:
九九乘法表
冒泡排序
浙公网安备 33010602011771号