数组的基本用法
文章目录
一、什么是数组
数组本质上是让程序员能够批量创建一组相同类型的变量
如果涉及到的数据很多,一个一个创建变量是很麻烦的,那通过数组就可以一次批量创建出一大堆变量
二、创建数组
创建数组的三种方式:
//创建数组
//数组的元素通过{}来指定
int[] arr = new int[]{1, 2, 3, 4};
//数组元素通过{}来指定
int[] arr2 = {1, 2, 3, 4};
//数组中的每个元素都被初始化成了 0
//主要wield指定数组的长度
int[] arr3 = new int[4];
//网络编程中非常常见
byte[] buffer = new byte[1024];
//这种形式是错误的,方括号中的数字与大括号不能同时出现
//int[] arr4 = new int[4]{1, 2, 3, 4};
三、数组使用
1、获取数组长度
Java通过 .length 方式获取到数组长度,一旦数组创建好了之后,length就是固定的,没办法再进行修改
// //用 length 属性获取数组长度
System.out.println(arr.length);
2、获取数组元素
使用下标访问数组元素时不能超出有效范围,如果超出范围,再Java语言中会抛出一个数组下标越界异常
// //用数组下标获取数组元素,下标从 0 开始算
System.out.println(arr[1]);
3、对数组元素进行遍历
.length 获取的是数组氧元素的个数,而数组下标是从 0 开始的,因此数组最后一个元素的下标应该是length - 1
//遍历数组
//按照一定的顺序将数组中的每一个元素都访问一遍,保证不重复也不遗漏
int[] arr = {1, 2, 3, 4};
for(int i = 0; i < arr.length; i++){
System.out.println(arr[i]);
}
//for each
//x 依次代表 arr 中的每一个元素
for(int x : arr){
System.out.println(x);
}
四、数组作为方法的参数
基本用法
1、数组作为方法的参数
数组传参相当于“赋值”,赋值的时候并不是把原来的数组拷贝了一份新数组,而是在原有数组的基础上起了一个别名,没有新创建一个数组。但是内置类型在进行 = 的时候不是起别名,而是创建了个新的对象。
// //数组传参就相当于“赋值”
int[] a = arr;
2、数组作为方法的返回值
//写一个方法,把数组中的每一个元素都 * 2
//这种方法把原有的数组破坏了
// private static void transform(int[] arr) {
// for(int i = 0; i < arr.length; i++){
// arr[i] *= 2;
// }
// }
public static int[] transform(int[] arr){
int[] result = new int[arr.length];
for(int i = 0; i < arr.length; i++){
result[i] = 2 * arr[i];
}
return result;//返回值是一个数组
}
3、数组转字符串
//约定打印成[1, 2, 3, 4]这样的格式
private static String arrayToString(int[] arr) {
String result = "[";
// for(int x: arr){
// result += (x + ", ");
// }
for(int i = 0; i < arr.length; i++){
result += arr[i];
if(i != arr.length - 1){
result += ", ";
}
}
result += "]";
return result;
}
也可以直接用Java库中的方法直接转成字符串的格式
Arrays.ToString()方法可以将数组转成字符串
System.out.println(Arrays.toString(arr));
4、数组拷贝
需要创建一个新的数组,将需要拷贝的数组的元素都复制粘贴到新的数组中
public static int[] copyOf(int[] arr) {
int[] newArr = new int[arr.length];
for(int i = 0; i < arr.length; i++){
newArr[i] = arr[i];
}
return newArr;
}
也可以直接使用标准库中的copyOf进行数组拷贝
int[] result = Arrays.copyOf(arr, arr.length);
标准库中的 copyOf 允许新的数组和旧的数组长度不一样
新的数组长度如果更短,就相当于“截断”
新的数组长度如果更长,多出来的部分,会自动填充成 0
5、查找数组中的指定元素
1)给定下标查找值
2)给定值查找下标
public static int search(int[] arr, int toSearch) {
//依次遍历访问元素
for(int i = 0; i < arr.length; i++){
if(arr[i] == toSearch){
return i;
}
}
return -1;
}
针对有序的数组可以使用 二分查找(折半查找)
6、冒泡排序
public static void bubbleSort(int[] arr) {
//从后往前遍历
//外层循环控制遍历的趟数
//已排序区间: [0, bound]
//待排序区间:[bound, length)
for(int bound = 0; bound < arr.length; bound++) {
//里层循环控制比较交换
for(int cur = arr.length -1; cur > bound; cur--) {
if(arr[cur - 1] > arr[cur]) {
//不符合排序要求就交换
int tmp = arr[cur - 1];
arr[cur - 1] = arr[cur];
arr[cur] = tmp;
}
}
}
标准库中的Arrays.sort也可以对数组进行排序,使用的是快速排序的方法
五、二维数组
二维数组本质上仍然是一个一维数组,每个元素是一个一维数组
C语言中的二维数组要求每一行的列数相同,Java语言中不要求每一行的列数相同
二维数组的创建
二维数组元素的下标也是从 0 开始的
//二维数组
int[][] arr = {
{1, 2, 3},
{4, 5, 6, 7},
{8, 9}
};
Java中也有三维数组,四维数组
三维数组本质上也是一个一维数组,每个元素又是一个二维数组