一 数组的定义:
数组是一种容器,如同声明的一种变量一样,数组保存一组相同数据类型的数据,而变量只能保存单个数据.
二 数组的声明方式:
声明数组的格式为: 数据类型[] 数组名 = 初值;--(注意:这里的数据类型指的是数组中保存的数据的类型)
方式一:
//int[] array = new int[数组的元素个数(长度)]; public static void main(String[] args){ //声明一个整形数组(可以保存5个int值) //注意:数组的长度一旦确定,就不能更改了 int[] array = new int[5]; //数组的长度为5 array.length = 5; //数组通过使用下标存取数据;下边从0开始 array[0] = 10; }
方式二:
int[] array = new int[]{1,3,5,11};
次方式即给了长度又给了元素
方式三(语法糖):
int[] array = {1,2,3,4};
三 数组在内存中的运行方式
public static void main(String[] args){ int[] array = new int[5]; array[3] = 10; array = null;//指向一个空的区域 }
四 数组的遍历(打印数组中所有的元素)
打印数组的方式:
//1.将数组每个元素按顺序打印出来 for(int i = 0; i < array.length; i++){ System.out.print(array[i] + " "); } //2.利用系统方法,将数组转化为字符串输出 System.out.pring(Arrays.toSring(array));
数组的封装问题:
public static void chang(int a, int b){ int c = a; a = b; b = c; } public static void main(String[] args){ int a = 10; int b = 15; chang(a , b); System.out.println("a = " + a); System.out.println("b = " + b); }
虽然在封装函数中将a和b的数据互换了一下,然而在打印的结果中a,b的值并没有变,这是因为只是在change函数内部中a,b的值互换,并没有在main函数中进行换位
此时,需要解决这种封装的问题,需要引用栈,堆内存地址的概念
public static void changeArray(int[] array){ for(int i = 0;i < array.length / 2;i++){ int a = array[i]; array[i] = array[array.length - i - 1]; array[array.length - i - 1] = a; } } public static void main(String[] args){ int[] array = {1,2,3};//传递了一个地址 changeArray(array);//对堆中给定地址的数据进行操作 System.out.println(Arrays.toString(array)); }
此时打印的结果为:
因为传递数据在堆内存中的地址后,才会对同一个数据进行操作
数组的经典遍历运用:排序与折半查找
1.冒泡排序(其核心思想为:相邻两个数比较换位)
int[] array = new int[]{1,3,5,6,2}; for(int i = 0; i < array.length - 1;i++){ for(int j = 0; j < array.length - 1 - i; j++){ if(array[j] > array[j + 1]){ int a = array[j]; array[j] = array[j + 1]; array[j + 1] = a; } } } System.out.println(Arrays.toString(array));
其打印结果为: [1,2,3,5,6];
2.选择排序(其核心思想为:选择一个数和其他的所有的数进行比较交换)
int[] array = {1,3,5,8,2}; for(int i = 0; i < array.length - 1; i++){ for(int j = i + 1; j < array.length; j++){ if(array[i] > array[j]){ int a = array[i]; array[i] = array[j]; array[j] = a; } } }其打印结果为:[1,2,3,5,8];
3.折半查找(前提:必须是有序的数组)
int[] arr = new int[] {11,22,33,44,55,66}; int key = 55; int min = 0; int max = arr.length - 1; int mid = (min + max) / 2; while(arr[mid] != key) { //判断key 和 中间角标值 来挪动 最小角标或最大角标 if (key > arr[mid]) { min = mid + 1; } if(key < arr[mid]){ max = mid - 1; } //每次循环都要有折半的操作 mid = (max + min) / 2; //数组没有这个数的时候 if (min > max) { //没有这个数 使用-1表示 mid = -1; break; //跳出循环 } } System.out.println("该值的坐标是:" + mid);
打印结果为:
五 多维数组
二维数组(容器):
保存多个相同类型的一维数组
数据类型[][] 数组名 = 初值;
三维数组:
保存多个相同类型的二维数组
数据类型[][][] 数组名 = 初值;-----数组的声明,几维数组就有几个[]
多维数组的遍历:
public static void main(String[] args) { //声明一个二维数组 //这个二维数组中 有两个一维数组 //每个一维数组中有三个元素 int[][] array = new int[2][3]; // aray.length 表示 有几个一维数组 System.out.println(array.length); // array.length = 2; int[][] arr = new int[][]{ {2,2,3}, {2,3,5} }; //遍历 for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[i].length; j++) { System.out.print(arr[i][j] + " "); } System.out.println(); } }
其打印结果为: