对于数组,我感觉是非常重要的,很多方面都用得到,在这里我会把数组有关的内容写下来。篇幅可能会有点长。
什么是数组
- 数组是同一数据类型的集合,数组一旦创建之后,大小就不可改变。
- 元素按线性顺序排列。
- 可以通过元素所在位置的顺序号(下标)做标识来访问每一个元素(下标从0开始,最大到元素个数-1)
a[0] | a[1] | … | a[n-1] |
---|---|---|---|
10 | 20 | … |
定义基本类型数组
-
声明数组的方法:
数据类型[ ] 数组名 = new 数组类型[大小] -
例如:
int[] arr = new int[10];
int[]:数据类型,表示数组中的每一个元素都是int类型
arr:数据类型变量(引用)
int[10]:数组的长度,即数组中元素的个数
- 定义基本类型数组的要点:
a.确切的数据类型
b.整体的数组名字
c.不能缺少的“[]” - 执行new语句才使得数组分配到了指定大小的空间。
- int [] arr 与 int arr [] 两种写法均可。
初始化数组
- 可以在数组声明的同时对数组进行初始化。
例如:int arr[] = {10, 20, 30, 40, 50};
元素的个数即为数组的长度。
- 此种写法只能用于声明时的初始化,不能用于复制。如下面的代码会有编译错误。
int [] arr;
arr = {10, 20, 25, 30, 40};
但是可以通过下面的方式给已经声明的数组的数组类型变量进行初始化:
int [] arr;
arr = new int[] {10, 20, 25, 30, 40};
注意:[ ]不可以写长度,元素的个数就是数组的长度
获取数组的长度
调用数组的length属性可以获得数组的长度:
int[] arr = new int[] {1, 2, 3, 4};
int len = arr.length;
System.out.print("数组的长度为:" +len);
//输出结果为:数组的长度为:4.
通过下标访问数组元素
数组中的元素可以通过下标的方式来进行访问(下标是从0开始到length-1):
int[] arr = new int[] {1, 2, 3, 4};
int temp = arr[2];//获取第三个元素3
//交换数组下标为2和3的两个元素
int temp = arr[2];//将arr[2]的值保存在变量temp中,现在temp是3
arr[2] = arr[3];//arr[2]是4
arr[3] = temp;//arr[3]现在是temp的值3
//交换后结果为:1,2,4,3
这里值得提一下的就是,交换两个元素的位置一定要引入第三个变量来做中间商,这个也是我老师经常跟我们说的,要把这些常用的东西变成自己的东西,一看到要交换两个元素位置,想不都不用想,一定是这样。
遍历数组元素
遍历数组元素,我们通常选择for循环语句,循环变量作为访问数组元素的下标,即访问数组的每一个元素。
int[] arr = {1, 3, 5, 7, 9};
for(int i = 0; i < arr.length; i++){
int n = arr[i];
System.out.print(n);
}
还有另外一种方式就是使用for each循环,直接迭代数组的每个元素:
int[] arr = {1, 3, 5, 7, 9};
for(int n : arr){
System.out.print(n);
}
虽然for each循环比for循环更简洁,但是for each循环无法拿到数组的索引,具体用哪个得看我们个人的需求。
数组的排序
- 排序是对数组施加的最常用的算法。
- 所谓排序,是指将数组元素安装从小到大或者大到小的顺序重新排列。
- 对于元素较多的数组,排序算法的好坏很重要。
- 一般情况下,通过排序过程中数组元素的交换次数来衡量排序算法的好坏;
- 常用的排序方法有:冒泡排序、插入排序、快速排序等。
下面我说一下冒泡排序算法
数组冒泡排序算法
- 冒泡排序的原则:比较相邻的元素,如果违反最后的顺序准则,则交换。
- 可以简化理解为:
a.第一次找到所有元素中的最大的放在最后一个位置,不再变动;
b.第二次找到剩余所有的元素中最大的放在倒数第二个位置上,不再变 动;
c.以此类推,直到排序完成。 - 比较是可以采用“下沉”的方式,也可以采用“上浮”的方式实现。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] ns = {89, 50, 84, 57, 61, 20, 86 };
// 排序前:
System.out.println(Arrays.toString(ns));
//上面的Arrays.toString()是打印的数组的意思。
for (int i = 0; i < ns.length - 1; i++) {
for (int j = 0; j < ns.length - i - 1; j++) {
if (ns[j] > ns[j+1]) {
// 交换ns[j]和ns[j+1]
//(这里前面说过了要引入第三个变量):
int tmp = ns[j];
ns[j] = ns[j+1];
ns[j+1] = tmp;
}
}
}
// 排序后:
System.out.println(Arrays.toString(ns));
}
}
//结果为:[89, 50, 84, 57, 61, 20, 86]
// [20, 50, 57, 61, 84, 86, 89]
实际上,JDK提供的Arrays.sort()方法(默认是“上浮”方式)封装了数组的排序算法:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] n = { 28, 12, 89, 73, 65, 18, 96, 50, 8, 36 };
Arrays.sort(n);
System.out.println(Arrays.toString(n));
}
}//结果为:[8, 12, 18, 28, 36, 50, 65, 73, 89, 96]
值得注意的是,对于使用Arrays.sort()方法,网上查找资料说的是,当我们调用这个方法的时候,变量n指向的内容已经被改变了。
多维数组
二维数组
二维数组是最常见的多维数组
二维数组就是数组的数组,定义一个二维数组:
int[][] arr = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12};
//因为n包含3个数组,所以n.length为3
- 多维数组的每个数组的长度都不要求相同;
- 访问二维数组的一个元素使用arry[row][col];
- 打印多维数组可以使用Arrays.deepToString();
对于数组的学习我的了解暂时就这些了,如有遗漏或者错误,大佬们可以在评论去告诉我。