JAVA第六学:数组的使用
1.数组的基本概念
1.1 定义
数组可以看成是相同类型元素的一个集合,在内存中是一段连续的空间。
1.2 创建及初始化
1.3 数组的使用
1.3.1 随机访问
1.3.2 遍历数组(.length)
所谓 "遍历" 是指将数组中的所有元素都访问一遍, 访问是指对数组中的元素进行某种操作,比如:打印
【for-each 写法会让x依次来取数组的每个元素 且 】
2.数组是引用类型
2.1 初始JVM的内存分布
2.2 基本类型变量与引用类型变量的区别
基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。
2.3 再谈引用变量
2.4 认识 null
3.数组的应用场景
3.1 保存数据
3.2 作为函数的参数
参数传基本数据类型:在方法中修改形参的值, 不影响实参的值。
参数传数组类型(引用数据类型)
发现在func方法内部修改数组的内容, 方法外部的数组内容也发生改变; 因为数组是引用类型,按照引用类型来进行传递,是可以修改其中存放的内容的。
总结: 所谓的 "引用" 本质上只是存了一个地址;Java 将数组设定成引用类型, 这样的话后续进行数组参数传参, 其实只是将数组的地址传入到函数形参中;这样可以避免对整个数组的拷贝(数组可能比较长, 那么拷贝开销就会很大).
3.3 作为函数的返回值
4.数组练习
4.1 数组转字符串
使用这个方法后续打印数组就更方便一些;Java 中提供了 java.util.Arrays 包,其中包含了一些操作数组的常用方法。
【模拟实现 toString】
public class F_ShuZu_2025_7_30 {public static void main(String[] args) {int[] arr = {1,2,3,4};System.out.println(toString(arr));}public static String toString(int[] a){String result = "[";for(int i = 0; i < a.length; i++){result += a[i];//保证最后一个数字后面没有逗号if(i < a.length-1){ result += ", "; }}result += "]";return result;}
}
4.2 数组拷贝
【模拟实现 copyOf】
public class F_ShuZu_2025_7_30 {public static void main(String[] args) {int[] arr1 = {1, 2, 3, 4, 5};int[] arr2 = copy(arr1,7);System.out.println(Arrays.toString(arr2));}public static int[] copy(int[] arr, int newLength){// 按照参数中指定的长度, 创建新的数组.int[] result = new int[newLength];int len = (newLength < arr.length ? newLength : arr.length);// 遍历原来的数组, 把每个元素都赋值过来.for(int i = 0; i < len; i++){ result[i] = arr[i]; }return result;}
}
4.3 查找数组中指定元素(顺序查找)
【模拟实现】
public class F_ShuZu_2025_7_30 {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5};System.out.println(find(arr,2));}//target-目标public static int find(int[] arr,int target){for(int i = 0; i < arr.length; i++){if(arr[i] == target){ return i; }}return -1;}}
4.5 查找数组中指定元素(二分查找)
public class F_ShuZu_2025_7_30 {public static void main(String[] args) {int[] arr = {1, 2, 3, 4, 5, 6, 7, 8};System.out.println(binarySearch(arr,6));}//binarySeaarch---二分查找 找到了返回对应下标 没有返回-1public static int binarySearch(int[] brr, int x){// 待查找区间最左侧元素与最右侧元素int left = 0;int right = brr.length - 1;// [left, right] 闭区间. 因此 left == right 的时候, 区间还是不空的, 仍然要继续找.while(left <= right){// 此处的 mid 就是中间位置元素的下标. 需要进行取整, 不能得到小数.int mid = (left + right) / 2;// 比较中间位置的元素, 是否和目标元素相同. 并且根据大小关系, 决定下一步查找的区间.// 左侧区间继续找 右侧区间找 找到了, 直接返回if(x < brr[mid]){ right = mid -1; }else if(x > brr[mid]){ left = mid + 1; }else{ return mid; }}// 元素不存在. 经过了上述循环的过程, 也没有找到匹配的元素.return -1;}}
可以看到, 针对一个长度为 10000 个元素的数组查找, 二分查找只需要循环 14 次就能完成查找. 随着数组元素个数 越多, 二分的优势就越大.
4.6 数组排序(冒泡排序)
public class F_ShuZu_2025_7_30 {public static void main(String[] args) {int[] brr = {7, 2, 9, 4, 0, 6, 3, 8};bubbleSort(brr);System.out.println(Arrays.toString(brr));}//bubbleSort--冒泡排序 升序排序public static void bubbleSort(int[] arr){for (int i = 0; i < arr.length - 1; i++) {// 进行每一趟具体的冒泡过程了. 总的比较次数, 需要注意好.// 在当前待比较区间的元素个数基础上, - 1 个.for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换两个元素int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}}}
4.7 数组逆序
public class F_ShuZu_2025_7_30 {public static void main(String[] args) {int[] brr = {1, 2, 3, 4, 5, 6, 7, 8};reverse(brr);System.out.println(Arrays.toString(brr));}public static void reverse(int[] arr) {int left = 0;int right = arr.length - 1;// 此处不需要写作 <= . 当 left == right 的时候, 就剩下一个元素了.// 一个元素不需要进行任何交换.while (left < right) {// 交换操作int tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;// 更新循环变量left++;right--;}}
}