Java码农进阶之路~数组的深进浅出

一 数组的定义:

数组是一种容器,如同声明的一种变量一样,数组保存一组相同数据类型的数据,而变量只能保存单个数据.

二 数组的声明方式:

声明数组的格式为: 数据类型[]  数组名 = 初值;--(注意:这里的数据类型指的是数组中保存的数据的类型)

方式一:
//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();
	}
}

其打印结果为:


猜你喜欢

转载自blog.csdn.net/t_kuuga/article/details/80230326