Day10-数组

Day10-数组

继续数组学习

数组类型参数

基本数据类型传递:传递值,一方改变不会影响另一方

引用数据类型传递:传递地址值,一方改变会影响另一方

public class TestArray01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		/* 参数类型:基本数据类型 引用数据类型 */
		//基本数据类型
		/*
		int a = 10;//局部变量存放在栈中
		print1(a);//实参 为局部变量进行赋值
		System.out.println(a);
		*/
		
		//引用数据类型
		int [] nums = {10,20,30,40};//引用数据类型传地址值 引用数据类型放在堆中
		printArray(nums);
		System.out.println("主方法遍历数组");
		for (int i = 0; i < nums.length; i++) {
			System.out.println(nums[i]+"\t");
		}
		System.out.println();
	}
	
	public static void printArray(int [] nums) {
		for (int i = 0; i < nums.length; i++) {
			nums[i] += 5;
		}
		System.out.println("printArray方法遍历数组");
		for (int i = 0; i < nums.length; i++) {
			System.out.println(nums[i]+"\t");
		}
		System.out.println();
	}
    /*
	public static void print1(int a) {//形参 局部变量的声明
		a += 5;
		System.out.println(a);		
	}
    */
}

数组类型返回值

public class TestArray02 {

	public static void main(String[] args) {
		//数组类型返回值
		int [] nums = {111,222,333,444,555};//假如地址为0x0000A001
		//将nums数组传递给名为expand的方法,该方法的返回值类型为整数数组类型。
        //将方法expand(扩容数组)返回的整数数组赋值给na数组
		int [] na = expand(nums);//0x0000B002
        //for循环遍历输出na数组中的每个元素。
		for (int i = 0; i < na.length; i++) {
			System.out.println(na[i]+"\t");
		}
		System.out.println();
	}
    /*
    Java中的数组是对象,因此在传递数组时实际上传递的是数组的引用。因此,在expand方法中对数组进行修改时,会修改传递进来的原始数组。
	另外,该程序中的newNums数组是在expand方法中创建的,因此,在方法返回后,该数组的引用仍然存在,直到垃圾回收机制将其清除。
    */
	public static int[] expand(int [] arr) {//0x0000A001
		int [] newNums = new int[arr.length*2];//构造,开辟新空间 0x0000B002
		//复制
		for (int i = 0; i < arr.length; i++) {
			newNums[i] = arr[i];
		}
		return newNums;//0x0000B002
	}
}

public class TestArray03 {

	public static void main(String[] args) {
		//数组类型返回值
		int [] nums = {111,222,333,444,555};//假如地址为0x0000A001
				
		expand(nums);//0x0000B002 没有接收的,释放
		for (int i = 0; i < nums.length; i++) {
			System.out.println(nums[i]+"\t");
		}
		System.out.println();
	}
	public static int[] expand(int [] arr) {//0x0000A001
		int [] newNums = new int[arr.length*2];//构造,开辟新空间 0x0000B002
		//复制
		for (int i = 0; i < arr.length; i++) {
			newNums[i] = arr[i];
		}
		return newNums;//0x0000B002
	}
}

可变长参数

概念:可接收多个同类型实参,个数不限,使用方式与数组相同

语法:数据类型 ... 形参名 //必须定义在形参列表最后,且只能有一个

public class TestArray04 {
	public static void main(String[] args) {
		//可变长参数JDK1.5之后
		//语法:数据类型...形参名
		int [] nums = {10,20,30,40,50};
		printArray(nums);
		
		printArray();//底层new数组
		
		printArray(1);
		
		printArray(1,2);
		
		printArray(1,2,3,4);
	}
	public static void printArray(int ... arr) {
		System.out.println("遍历参数");
		for (int a : arr) {
			System.out.println(a+"\t");
		}
		System.out.println();
	}
}

数组排序

冒泡排序

原理:相邻两个数值比较大小,互换位置

记忆:外层循环 length - 1,内层循环 length - i - 1

public class TestBubble {
	public static void main(String[] args) {
		//冒泡排序:相邻两个数比较大小,互换位置
		
		int [] nums = {4,3,5,2,1};
		/*
		int a = 10;
		int b = 20;
		
		int temp = a;
		a = b;
		b = temp;
		
		System.out.println(a);//20
		System.out.println(b);//10
		*/
		
		
		//前一个数比后一个数大,交换
		
		for (int i = 0; i < nums.length-1; i++) {//控制轮数
			for (int j = 0; j < nums.length-1-i; j++) {//控制次数
				if (nums[j] > nums[j+1]) {					
					int temp = nums[j];
					nums[j] = nums[j+1];
					nums[j+1] = temp;
				}
			}
		}
		for (int k = 0; k < nums.length; k++) {
			System.out.print(nums[k]+"\t");
		}
		System.out.println();
	}

}

选择排序

原理:固定值与其他值依次比较大小,互换位置

记忆:外层循环 length - 1,内层循环开始位置 j = i + 1

public class TestSelect {
	public static void main(String[] args) {
		//选择排序:固定值与其他值依次比较大小,互换位置
		int [] nums = {4,3,5,2,1};
		for (int i = 0; i < nums.length - 1; i++) {//控制轮数
			//不与自身比较
			for (int j = i + 1; j < nums.length; j++) {//控制次数
				if (nums[i] > nums[j]) {
					int temp = nums[i];
					nums[i] = nums[j];
					nums[j] = temp;
				}
			}
		}
		for (int k = 0; k < nums.length; k++) {
			System.out.print(nums[k]+"\t");
		}
		System.out.println();
	}

}

JDK排序

java.util.Arrays.sort(数组名)//JDK提供(升序)

public class TestJDK {
	public static void main(String[] args) {
		//JDK排序:java.util.Arrays.sort(数组名)//JDK提供(默认升序)
		
		int [] nums = {4,5,3,2,1};
		java.util.Arrays.sort(nums);
		
		//遍历输出
		for (int i = 0; i < nums.length; i++) {
			System.out.print(i+"\t");
		}
		//逆序排序
		System.out.println("逆序排序");
		/*
		将数组的前一半和后一半的元素进行交换(已经是升序的状态)。首先,定义了一个循环,从数组的第一个元素到中间元素的位置循环,将当前元素和其对称位置的元素进行交换。这样,就可以将数组逆序排列。
		*/
		for (int j = 0; j < nums.length/2; j++) {
			int temp = nums[j];
			//nums.length-1 表示数组 nums 的最后一个元素的下标,然后再减去 j,就可以得到与 j 对称位置的元素的下标了
			nums[j] = nums[nums.length-1-j];
			nums[nums.length-1-j] = temp;
		}
		System.out.println();
		for (int i : nums) {
			System.out.print(i+"\t");
		}
	}

}

二维数组(二重循环)

概念:一维数组中的一维数组;数组中的元素,还是数组

注意:高维数组中的每一个元素,保存了低维数组的地址。访问array[0]等价于在访问0x0000A111

二维数组是一种特殊的数组,它本质上是一个由多个一维数组组成的数组。一维数组可以看成是一个线性结构,而二维数组则可以看成是一个矩阵结构

第一个数字表示行号,第二个数字表示列号。例如,arr[2][3] 表示二维数组 arr 中第三行第四列的元素。

public class TestDArray1 {
	public static void main(String[] args) {
		//定义二维数组                         行        列   
		//数据类型 [][] 数组名 = new 数据类型[高维长度][低维长度];
		//数据类型 数组名[][] = new 数据类型[高维长度][低维长度];
		
		int [][] nums = new int[3][5];
		//int nums [][] = new int[3][5];
		
		//存值
		nums[0][0] = 10;//第一行第一列
		nums[0][3] = 20;
		nums[1][0] = 30;
		nums[1][1] = 40;
		nums[2][2] = 50;
		nums[2][4] = 60;
		
		//取值
		System.out.println(nums.length);//行3
		//nums 有3个一维数组,每个一维数组都有5个元素。
		//因此,nums[1].length 和 nums[2].length 的结果都是5
		System.out.println(nums[0].length);//访问低维长度 首个低维数组的长度 列5
		System.out.println(nums[1].length);//列5
		System.out.println(nums[2].length);//列5
		
		//遍历二维数组
		for (int i = 0; i < nums.length; i++) {//遍历行 i = 0,1...
			for (int j = 0; j < nums[i].length-1; j++) {//遍历列
				System.out.print(nums[i][j]+"\t");
			}
			System.out.println();
		}
		
		//高维数组中的每一个元素,保存了低维数组的地址。访问array[0]等价于在访问0x0000A111
		System.out.println(nums);
		System.out.println(nums[0]);
		System.out.println(nums[1]);
		System.out.println(nums[2]);
	}
}

public class TestDArray2 {
	public static void main(String[] args) {
		/*
		 二维数组的创建语法
		 先声明、再分配空间:
		 数据类型[][] 数组名;
		 数组名 = new 数据类型[高维长度][低维长度];
		int[][] nums;
		nums=new int[3][5];
		声明并分配空间:
		数据类型[][] 数组名 = new 数据类型[高维长度][低维长度];
		int[][] nums=new int[3][5];
		声明并赋值(繁):
		数据类型[][] 数组名 = new 数据类型[高维长度][]; //不规则数组,自行new低维数组
		声明并赋值(简):
		数据类型[][] 数组名 = { {v1,v2,v3},{v4,v5},{v6,v7,v8,v9} }; //显示初始化
		 */
		
		//声明并赋值(繁)
		//数据类型[][] 数组名 = new 数据类型[高维长度][];
		int [][] nums = new int [3][];
		
		//创建低维数组
		int [] a = new int[3];
		nums[0] = new int[5];//第一行5列
		nums[1] = a;//第二行3列
		nums[2] = new int[2];//第三行2列
		
		System.out.println("遍历二维数组");
		//数组有默认值 0
		/*
		下面循环结果如下:
		0	0	0	0	0	
		0	0	0	
		0	0	
		*/
		for (int i = 0; i < nums.length; i++) {
			for (int j = 0; j < nums[i].length; j++) {
				System.out.print(nums[i][j]+"\t");
			}
			System.out.println();
		}
		
		//声明并赋值(简)
		//数组类型 [][] 数组名 = { {v1,v2,v3},{v4,v5},{v6,v7,v8,v9} }; //显示初始化
		double [][] scores = {{3.14,12.6},{5.67},{4.14,7.89,6.12}};
		System.out.println("遍历二维数组");
		/*
		下面循环结果如下:
		3.14	12.6	
		5.67	
		4.14	7.89	6.12
		*/
		for (double[] score : scores) {
			for (double s : score) {
				System.out.print(s+"\t");
			}
			System.out.println();
		}
	}

}

posted @ 2021-07-21 21:41  CN_Darren  阅读(41)  评论(0)    收藏  举报