一、数组

1.数组的概念:数组是一种"容器",存储同一种类型的元素。

2.数组的定义:

数据类型[] 数组名;               如:int[] arr;

数据类型  数组名[];                 如:int arr[];

3.数组的初始化

1)动态初始化: 指定数组的长度,系统默认给数组中的元素赋值.

数据类型[] 数组名 = new 数据类型[数组长度];                    如: int[] arr = new int[5];

数据类型 数组名[] = new 数据类型[数组长度];                   如:int arr[] = new int[5];

2)静态初始化:直接指定数组的元素内容,系统指定的数组长度

标准格式:
    数据类型[] 数组名称 = new 数据类型[]{元素1,元素2,元素3,,,,} ;           如:int[] arr = new int[]{2,3,4,5};
    数据类型 数组名称[] = new 数据类型[]{元素1,元素2,元素3,,,,} ;           如:int arr[]= new int[]{2,3,4,5};
    
简写方式:(推荐)
    数据类型[] 数组名称 = {元素1,元素2,元素3,,,,}  ;                                  如:int[] arr = {2,3,4,5};
    数据类型 数组名称[] = {元素1,元素2,元素3,,,,}  ;                                  如:int arr[] = {2,3,4,5};

4.数组的应用

1)遍历:就是将元素的内容一一输出出来!

public static void printArray(int[] array){//方法的形式参数:传递的是一个引用类型:数组
		for(int x = 0 ; x < array.length ; x ++){
			System.out.println(array[x]) ;
		}
	}

2)求最值:如求数组中的最大值

public static int getMax(int[] array){ //形式参数传递的是一个数组,方法调用,实际参数需要改数组的对象
			//定义一个参照物
		int max = array[0] ;
		
		//遍历后面的元素:从索引1开始
		for(int x =1 ; x < array.length ; x ++){
			//判断 如果后面的元素都大于max了,
			if(array[x] > max){
				//将该元素赋值max
				max = array[x] ;
			}
		}
		return max ;
	}

3)逆序:数组的逆序排列

方法一:
public static void reverse(int[] arr){
	for(int x = 0 ; x < arr.length/2; x ++){
		//进行互换
		int temp = arr[x] ;
		arr[x] = arr[arr.length-1-x] ;
		arr[arr.length-1-x]  = temp ;
	}
}
方法二:
public static void reverse2(int[] arr){
		//在一个for循环中定义两个变量
		//start:表示开始索引
		//end:最终最大索引
		for(int start = 0,end = arr.length -1 ; start<=end ;start ++,end -- ){
			//中间第三方变量
			int temp = arr[start] ;
			arr[start] = arr[end] ;
			arr[end] = temp ;
		}
	}

4)元素基本查找:从数组中的开始索引一直查询到末尾,查询出元素第一次在数组中的索引值

方法一:
public static int getIndex(int[] arr,int key){
		//1)遍历arr数组
		for(int x = 0 ; x < arr.length ; x ++){
			//获取到每一个元素
			//判断:如果arr[x] == key ---- >查找到这个元素,返回角标值
			if(arr[x] == key){
				return x ;
			}
		}
		
		//对于判断:要么成立,要么不成立 (成立,表示查询到了)
		//如果元素没有在数组中出现,查不到,要考虑返回某个值 "负数" 一般找不到:-1
		return -1 ;
	}
方法二:(假设法)
public static int getIndex2(int[] arr,int key){
		//假设元素找不到
		//定义一个变量
		int index = -1 ;
		//遍历数组arr
		for(int x = 0 ; x < arr.length ; x ++){
			//获取到每一个元素
			if(arr[x] == key){
				//将index的值更改掉
				index = x ; 
				break ;
			}
		}
		return index ;
	}

二、二维数组

1)定义:其实就是一个元素为一维数组的数组

格式一:数据类型[][] 数组名称 = new 数据类型[m][n] ;

                 如:int[][] arr = new int[3][2] ;

格式二:指定了一维数组的个数,一维数组的长度需要动态给定   
              数据类型[][] 数组名称 = new 数据类型[m][] ;

                 如:int[][] arr = new int[3][] ;

格式三: 静态初始化
        数据类型[][] 数组名称 = new 数据类型[][]{{元素1,元素2,元素3..},{元素1,元素2,元素3,...},{,}};
        简写格式:
        数据类型 [][] 数组名称 = {{元素1,元素2,元素3..},{元素1,元素2,元素3,...},{,}};    
        举例
            int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9}} ;
            -->简写格式
            int[][] arr = {{1,2,3},{4,5,6},{7,8,9}} ;

2)二维数据的遍历

public static void printArray2D(int[][] arr){
		//输出以下左大括号
		System.out.print("{");
		//遍历
		for(int x = 0 ; x < arr.length; x++){//外层循环是一维数组的个数
			//先输出左大括号
			System.out.print("{");
			//遍历一维数组的元素
			for(int y = 0 ; y < arr[x].length ; y++){
				//判断
				//如果是二维数组的最后一个元素
				if(y==arr[arr.length-1].length-1){
					//输出元素值以及后面的}
					System.out.print(arr[x][y]+"}") ;
					
					//如果当前元素取到的一维数组的最后一个元素
				}else if(y == arr[x].length-1){
					//输出元素内容以及}以及,
					System.out.print(arr[x][y]+"}"+",") ;
				}else{
					System.out.print(arr[x][y]+",") ;
				}
			}
			
		}
		//输出整个右}
		System.out.print("}");
	}

3)例:杨辉三角形

/*
控制台输出
杨辉三角形:
1
1 1
1 2 1
1 3 3 1 
1 4 6 4 1 
1 5 10 10 5 1
规律:
	1)任意一行的第一列和最后一列都是1
	2)从第三行开始中间每一个数据都等于上一行的前一列和上一行的本列之和

	
	二维数组:int[][] arr = new int[m][n] ;
分析:
	1)键盘录入一个数据: n
	2)定义一个二维数组:n行n列  int[][] arr = new int[n][n] ;
	3)遍历二维数组,先给任何一行的第一列以及任何一行的最后一列赋值为1
	4)从第三行开始,遍历二维数组,给中间的数据填充:
		从第三行开始中间每一个数据都等于上一行的前一列和上一行的本列之和
*/
//导包
import java.util.Scanner;
class Array2Test2{
	public static void main(String[] args){
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in) ;	
		//提示并接收
		System.out.println("请您输入一个数据n:") ;
		int n = sc.nextInt() ;
		//定义一个二维数组
		int[][] arr = new int[n][n] ;
		//遍历二位数组,给任何一行的第一列和任何一行的最后一列赋值为1
		for(int x = 0 ; x < arr.length ; x ++){
			arr[x][0] = 1 ;
			arr[x][x] = 1 ;
		}
		//填充中间的数据:
		//从第三行开始中间每一个数据都等于上一行的前一列和上一行的本列之和
		for(int x = 2 ; x < arr.length ; x ++){ //行数
			//y:元素的内容
			//y<=x-1 :考虑最后一列的问题  (中间的元素:考虑第一列和最后列)
			for(int y = 1 ; y<= x -1 ; y++){//列
				//第三行开始中间每一个数据都等于上一行的前一列和上一行的本列之和
				arr[x][y] = arr[x-1][y-1] + arr[x-1][y] ;
			}				
		}
		//在杨辉三角中遍历二维数组---->类似与99乘法表
		for(int x = 0 ; x < arr.length ; x ++){
			for(int y = 0 ; y <=x ; y++){
				System.out.print(arr[x][y] +"\t") ;
			}
			System.out.println() ;
		}
	}
}

三、方法的形式参数问题

形式参数如果是一个基本数据类型,形式参数对实际参数没有影响

形式参数如果是一个引用数据类型(数组,接口,类等),形式参数的改变对实际参数有很大影响

String是特殊的引用类型,它如果作为形式参数--->特点跟基本数据类型特点一样

class ArgsDemo{
	public static void main(String[] args){
		
		//定义两个变量
		int a = 10 ;	
		int b = 20 ;	
		System.out.println("a:"+a+",b:"+b) ;//10,20
		change(a,b) ;
		System.out.println("a:"+a+",b:"+b) ;//10,20 
		
		int[] arr = {1,2,3,4,5} ; //new int[]{1,2,3,4,5};
		change(arr) ;
		System.out.println(arr[1]) ; //4
	}
	
	//形式参数是两个基本数据类型数据
	public static void change(int a,int b){ //实际参数赋值给形式参数
		System.out.println("a:"+a+",b:"+b) ;//10,20
			a = b ;
			b = a +b ;
		System.out.println("a:"+a+",b:"+b) ;//20,40
	}
	
	public static void change(int[] arr){
		//遍历
		for(int x = 0 ; x  < arr.length ; x ++){
			if(arr[x]%2 ==0){
				arr[x] *= 2 ;
			}
		}
	}
}