重新建网站需要转域名吗推广app赚钱的平台
文章目录
- 一、数组的基础概念(是什么、定义、使用)
- 二、数组进阶概念
- 2.2 JVM的内部存储
- 2.3 数组在内存中的存储
- 2.4 数组传参 + 返回值
- 2.5 数组的应用场景
- 2.5.1 数组的查找
- 2.5.2 toString 的自我实现
- 2.5.3 数组排序
- 2.5.4 数组拷贝
- 2.6 二维数组
一、数组的基础概念(是什么、定义、使用)
❤️什么是数组:
- 数组是一块连续的空间
- 里面存放相同数据类型的集合
- 下标是从0开始的,大小为数组长度 - 1
❤️如何定义数组:
静态初始化:创建数组的时候,不指定个数,根据数据内容来确定
- 第一种:int [ ] arr = {1, 2, 3, 4, 5};
- 括号里面不能加数字,因为int [ ] 表示的是数组类型
- 这是最常使用的,相比于第三种可以直观地看出数组的类型,相比于第二种省略了一些标识符
- 第二种:int [ ] arr = new int [ ]{1, 2, 3, 4, 5};
- new int [ ] 的括号里面不能放数字,因为int [ ] 表示的是数组类型
- 没有指定个数,而是根据数组长度确定数组个数
- 就含义而言,与第一种一模一样,只是写法不同,new表示新,即在内存中为这个变量开辟内存。new int [ ] 则表示为这个整型数组分配内存,并且赋值1、2、3、4、5
- 第三种 int arr [ ] = {1, 2, 3, 4, 5};
- C语言写法,不推荐,因为无法直观地看出类型
动态初始化:创建数组时,只说明数组的大小
- 第四种:int [ ] arr = new int [5];
- 创建一个元素为5的整型数组,但是没有初始化,int类型默认值是0
- 如果想要指定赋值,需要arr[3] = 5; 根据数组下标指定
❤️数组的使用:
- 单个访问用数组下标
int[] arr1; //truearr1 = new int[]{1,2,3,4,5};arr1[1] = 10;System.out.println(arr1[1]); //方括号像C语言一样,自带解引用效果
- 遍历数组
import java.util.Arrays;public static void main(String[] args) {int[] arr1 = {1,2,3,4,5};for (int i = 0; i < arr1.length; i++) { //数组.length可以求得这个数组的长度System.out.print(arr1[i] + " ");}System.out.println();for (int x:arr1) { //增强for循环,相比于第一种方法,无法看出该元素的下标System.out.print(x + " ");}//取出arr1里面的元素放到x中,然后打印System.out.println();System.out.println(Arrays.toString(arr1));//把数组转成字符串的形式打印,需要导包}
- 数组填充
- 可以用for循环填充
- fill方法
public static void main(String[] args) {int[] arr = new int[10];System.out.println("最初值:" + Arrays.toString(arr));Arrays.fill(arr,1);System.out.println("全部初始化:" + Arrays.toString(arr));Arrays.fill(arr,0,5,4); //[0, 5)System.out.println("局部初始化:" + Arrays.toString(arr));
}
❤️注意点:
- 数组越界访问会报错
- 数组只有在定义的时候才可以整体初始化
public static void main(String[] args) {int[] arr1; //truearr1 = new int[]{1,2,3,4,5};int[] arr2; //truearr2 = new int[5];/*int[] arr3; //falsearr3 = {1,2,3,4,5}; */}
- 数组没有初始化的时候,会有默认值
类型 | 默认值 | ||
基本数据类型 | 整型 | byte | 0 |
short | 0 | ||
int | 0 | ||
long | 0 | ||
浮点型 | float | 0.0f | |
double | 0.0 | ||
字符型 | char | /u0000 | |
布尔型 | boolean | false | |
引用数据类型 | null |
二、数组进阶概念
2.2 JVM的内部存储
2.3 数组在内存中的存储
- int[ ] arr = null
- null表示这个引用不指向任何空间,注意这个时候如果直接去访问这个数组是错误的 ------>空指针异常
- 数组的互相赋值:
public static void main(String[] args) {int[]arr1 = new int[5];int[]arr2 = new int[]{1,2,3,4,5};arr1 = arr2;System.out.println("把arr2赋值给arr1后:");System.out.print("arr1[0] = " + arr1[1] + " ");System.out.println("arr1[0] = " + arr2[1]);System.out.println();arr1[1] = 10;System.out.println("把arr1[0]修改为10后");System.out.print("arr1[0] = " + arr1[1] + " ");System.out.print("arr1[0] = " + arr2[1]);}
2.4 数组传参 + 返回值
- 数组的传参(改变了实参数据):
public static void array(int[] arr){System.out.println(arr[0]);}public static void main(String[] args) {int[] arr = {1,2,3,4,5};array(arr);}
也是为什么某些情况下传过去的形参能够改变实参的原因,注意在调用完array方法后,形参arr会被销毁
- 数组的传参(未改变实参数据):
public static void fun(int[] arr){arr = new int[4];}public static void main(String[] args) {int[] arr = {1,2,3,4,5};System.out.println(Arrays.toString(arr));fun(arr);System.out.println(Arrays.toString(arr));}
- 传回多个数据(把数组作为返回类型):
public static void main(String[] args) {int[]arr = fun();System.out.println(Arrays.toString(arr));}public static int[] fun() {int a = 2;int b = 3;return new int[]{a, b};}
2.5 数组的应用场景
2.5.1 数组的查找
❤️ 一个一个查找
public static int search(int[]arr, int k){boolean flag = false;for (int i = 0; i < arr.length; i++) {if (arr[i] == k){flag = true;return i;}}return -1;}public static void main(String[] args) {int[]arr = {1,2,3,4,5,6,7};Scanner scanner = new Scanner(System.in);int k = scanner.nextInt();int index = search(arr,k);if(index != -1){System.out.println("在第" + (index + 1) + "个位置");}else{System.out.println("查无此数");}}
❤️ 二分查找(有序数组):
public static int search(int[]arr, int k){int len = 0;int right = arr.length - 1;while (len <= right){int middle = (len + right) / 2;if (arr[middle] < k){len = middle + 1;}else if(arr[middle] > k) {right = middle - 1;}else{return middle;}}return -1;}public static void main(String[] args) {int[]arr = {1,2,3,4,5,6,7};Scanner scanner = new Scanner(System.in);int k = scanner.nextInt();int index = search(arr,k);if(index != -1){System.out.println("在第" + (index + 1)+ "个位置");}else{System.out.println("查无此数");}}
❤️库里的方法实现(无序/有序):
public static void main(String[] args) {int[]arr = {4,6,2,7,29,56,32,1};System.out.println(Arrays.toString(arr));System.out.println(Arrays.binarySearch(arr, 29));Arrays.sort(arr);System.out.println(Arrays.toString(arr));System.out.println(Arrays.binarySearch(arr, 29));}
2.5.2 toString 的自我实现
public static String myTostring(int[] arr){if (arr == null){return null;}String ret = "{";for (int i = 0; i < arr.length; i++) {ret += arr[i];if(i != arr.length - 1){ret += ",";}}ret += "}";return ret;}public static void main(String[] args) {int[]arr = {1,2,3,4,5,6,7};System.out.println(myTostring(arr));}
2.5.3 数组排序
❤️库方法:
Arrays.sort ( 数组名 );
public static void main(String[] args) {int[]arr = {4,6,2,7,29,56,32,1};Arrays.sort(arr);System.out.println(Arrays.toString(arr));}
❤️冒泡排序
public static void main(String[] args) {int[]arr = {4,6,2,7,29,56,32,1};bubberSelect(arr);System.out.println(Arrays.toString(arr));}public static int[] bubberSelect(int[]arr){for (int i = 0; i < arr.length - 1; i++) {boolean flag = false;for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j + 1]){int tmp = 0;tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = true;}}if (flag == false){return arr;}}return arr;}
2.5.4 数组拷贝
❤️自己实现:
public static void main(String[] args) {int[]arr = {4,6,2,7,29,56,32,1};myCopyOf(arr);System.out.println(Arrays.toString(arr));}public static int[] myCopyOf(int[] arr){int [] arr2 = new int[arr.length];for (int i = 0; i < arr.length; i++) {arr2[i] = arr[i];}return arr2;}
❤️库方法:
public static void main(String[] args) {int[]arr = {4,6,2,7,29,56,32,1};System.out.println(Arrays.toString(arr));int[]ret = (Arrays.copyOf(arr, arr.length));System.out.println(Arrays.toString(ret));}
❤️指定拷贝
- Arrays.copyOfRange:
public static void main(String[] args) {int[]arr = {4,6,2,7,29,56,32,1};int[] ret = Arrays.copyOfRange(arr, 6, 8); //[6, 8)System.out.println(Arrays.toString(ret));}
- System.arraycopy
public static void main(String[] args) {int[] arr = {4,6,2,7,29,56,32,1};int[] ret = new int[arr.length];System.arraycopy(arr,2, ret, 0,5);System.out.println(Arrays.toString(ret));}
❤️数组逆序:
public static void reverseArray(int[] array) {int i = 0;int j = array.length-1;while (i < j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;i++;j--;}}public static void main(String[] args) {int[] arr = {1,2,3,4,5};reverseArray((arr));System.out.println(Arrays.toString(arr));}
2.6 二维数组
二维数组是特殊的一维数组
❤️二维数组的定义:
public static void main(String[] args) {int[][] arr = {{1,2,3},{4,5,6}};int[][] arr2 = new int[2][3];int[][] arr3 = new int[][]{{1,2,3},{4,5,6}};
}
❤️二维数组的使用:
- 单个使用 ----------------> 用数组下标
eg.arr[0][1] 、 arr[1][2] - 遍历数组
for循环:
public static void main(String[] args) {int[][] arr = {{1,2,3},{4,5,6}};for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[0].length; j++) {System.out.print(arr[i][j] + " ");}System.out.println();}}
foreach:
public static void main(String[] args) {int[][] arr = {{1,2,3},{4,5,6}};for (int[]tmp:arr) {for (int x:tmp ) {System.out.print(x + " ");}System.out.println();}
}
Arrays.deepToString:
public static void main(String[] args) {int[][] arr = {{1,2,3},{4,5,6}};System.out.println(Arrays.deepToString(arr));
}
❤️二维数组的特殊灵活性:
C语言中可以省略行,但是不能省略列,Java刚好相反,可以省略列,但是不能省略行