编程日记:Java学习之路(六)
数组及常用算法
一、数组
如果我们需要定义同一类型的数据并且需要对这些数据进行批量的处理和操作的话我们就可以使用数组
数组的定义:
1 public class Test { 2 public static void main(String[] args) { 3 int a; //定义int类型的变量 4 int[] arr; //定义int类型的数组 5 } 6 }
定义数组的语法:
类型[] 数组名;
几种定义数组的语法:
public class Test { public static void main(String[] args) { int[] array1; int []array2; int [] array3; int[]array4; int array5[]; } }
在定义一个数组之后,要告诉JVM数组中元素的个数,也就是数组的长度:
int[] array = new int[5];
new用来分配空间,5代表的是数组的长度
数组占用内存中一块连续的空间,数组一旦被创建,在内存中的空间就是确定的,数组的长度就不能在发生
数组中的元素使用数组名[下标]访问:第一个元素的下标为0,最后一个元素下标为长度-1
数组中的每一个元素都可以作为一个普通的变量使用。
元素下标为0~长度-1,可以使用循环访问数组中的每一个元素,不会重复和遗漏:
如果对元素没有赋值的话我们可以使用么
1 public class Test { 2 public static void main(String[] args) { 3 int[] array = new int[5]; 4 for (int i = 0;i < 5;i++){ 5 System.out.println(array[i]); 6 } 7 } 8 }
数组中的元素可以不赋值,创建数组时已经被赋默认值。
不同类型的默认值:
| 类型 | 默认值 |
| 数值类型 | 0,0L,0.0F,0.0 |
| char | '\u0000' |
| boolean | false |
| 引用类型 | null |
数组可以在创建时给每个元素赋初始值:
int[] array = new int[]{1,2,3,4,5};
注意,以下是错误的方式:
int[] array = new int[5]{1,2,3,4,5};
可以简写为:
int[] array = {1,2,3,4,5};
数组类型可以作为函数的参数和返回值:
- 数组类型作为实参时,只需要数组名,不需要方括号
- 数组类型作为形参时,只需要数组名和方括号,不需要长度
- 数组类型做返回值时,只需要数组名,不需要方括号
- 数组类型作为返回值类型时,只需要数组名和方括号,不需要长度
public static void main(String[] args) { }
String[] args就是一个字符串类型的数组
定义一个函数,形参为一个int数组,用来把数组中的每一个元素输出(遍历)
1 public class Test{ 2 public static void main(String[] args) { 3 int[] arr = {1,2,3,4,5}; 4 printArrag(arr); 5 } 6 public static void printArrag(int[] array){ 7 for (int i = 0;i < 5;i++){ 8 System.out.println(array[i]); 9 } 10 } 11 }
每个数组都有一个length属性,用来表示数组的长度:
数组名.length
1 public static void printArrag(int[] array){ 2 for (int i = 0;i < array.length;i++){ 3 System.out.println(array[i]); 4 } 5 }
数组一旦创建完成便不可以更改其长度,那么我们要是想要添加一个新的元素应该怎么办呢?
- 新增一个元素,数组的长度不够了
- 数组一旦创建就不可以改变长度
- 创建一个新的数组,长度比原来的数组多1
- 把原数组中的数据放到新数组中,并且加入新的数据
1 public class Test { 2 public static void main(String[] args) { 3 int[] arr = {1,2,3,4,5}; 4 printArr(appendArr(arr,6)); 5 } 6 //添加一个元素到数组中 7 public static int[] appendArr(int[] array,int n){ 8 int[] newArray = new int[array.length+1]; 9 for(int i = 0;i < array.length;i++){ 10 newArray[i] = array[i]; 11 } 12 newArray[array.length] = n; 13 return newArray; 14 } 15 //数组输出 16 public static void printArr(int[] arr){ 17 for (int i = 0;i < arr.length;i++){ 18 System.out.println(arr[i]); 19 } 20 } 21 }
二、查找和排序
什么是查找
查找:根据给定的某个值,在一组数据中确定其值等于给定值的元素。(顺序查找,折半查找......)
什么是排序?
排序:将一组元素的任意序列,按照其值重新排列成一个有序的序列。(冒泡排序,选择排序......)
顺序查找:从第一个元素的开始,逐个与元素的给定值进行比较,如果某个元素与给定值相等,则查找成功,若到达最后一个元素都不相等,则查找不成功
public class Test01 { public static void main(String[] args) { int[] arr = {1,2,3,4,5}; System.out.println(seqSearch(arr,2)); } //数组输出 public static void printArr(int[] arr){ for (int i = 0;i < arr.length;i++){ System.out.println(arr[i]); } } public static int seqSearch(int[] array,int n){ for(int i = 0;i < array.length;i++){ if(array[i] == n){ return i; } } return -1; } }
折半查找:先确定待查找元素所在的范围,然后逐步缩小范围直到找到或者找不到该元素为止。(要求元素必须是有序的)
1 public class Test { 2 public static void main(String[] args) { 3 int[] arr = {1,2,3,4,5}; 4 System.out.println(binSearch(arr,3)); 5 6 } 7 8 public static void printArr(int[] arr){ 9 for (int i = 0;i < arr.length;i++){ 10 System.out.println(arr[i]); 11 } 12 } 13 14 public static int binSearch(int[] array,int n){ 15 int p = 0,q = array.length - 1; 16 while (p<=q){ 17 int m = (p + q)/2; 18 if (array[m] < n){ 19 p = m+1; 20 }else if (array[m]>n){ 21 q = m - 1; 22 }else { 23 return m; 24 } 25 } 26 return -1; 27 } 28 }
冒泡排序:两个相邻元素依次进行比较,如果前面的元素大于后面的元素,则两个元素交换位置
选择排序:每个元素依次和后面的元素进行比较,如果大于后面的元素,则和后面的元素交换位置
代码详见:https://www.cnblogs.com/Machinehe/p/15424346.html
三、二维数组
定义二维数组:
类型[][] 数组名 = new 类型[高维度][低维度];
1 int[] array1 = new int[3];//一维数组 2 int[][] array2 = new int[3][5];//二维数组array2的长度为3,每个元素的长度为5
在java中可以创建不规则的二维数组:
1 int[][] array = new int[3][]; 2 array[0] = new int[2]; 3 array[1] = new int[5]; 4 array[2] = new int[4];
也可以在定义二维数组时指定初始值:
1 int[][] array = { 2 {1,2}, 3 {3,4,5,6,7}, 4 {8,9,10,11,12} 5 }
二维数组的遍历:
1 for (int i = 0;i < array.length;i++){ 2 for (int j = 0;j<array[i].length;i++){ 3 System.out.println(array[i][j]+"\t"); 4 } 5 System.out.println(); 6 }
Tip:“你并不是平庸的,只是因为有人的才能覆盖了你,所以去超越!”

浙公网安备 33010602011771号