Java自学笔记Day06

day06

数组

一维数组

A:为什么要有数组?
	*为了存储同种数据类型的多个值;
B:数组概念?
	*数组是存储同一种数据类型多个元素的集合,也可以看成一个容器;
	*数组既可以存储基本数据类型,也可以存储引用数据类型;
C:数组定义格式
	数据类型[] 数组名 = new 数据类型(数组的长度);
D:数组初始化
	#什么是数组的初始化?
		数组初始化就是为数组开辟连续的内存空间,并为每个数组元素赋值;
	#数组如何进行初始化?
		a:动态初始化,只指定长度,由系统给出初始化值;
			int[]  arry = new int[5]
		b:静态初始化,给出初始化值,由系统决定长度;
	#动态初始化格式:
		数据类型[] 数组名 = new 数据类型[数组长度];
      * 数组默认值:
		* 整数类型:byte,short,int,long默认初始值都是0;
		* 浮点类型:float,double默认初始值都是0.0;
		* 布尔类型:boolean默认初始化值是false;
		* 字符类型:char默认初始化值是'\u000'
           	\u000,每一个0其实代表的是16进制的0,那么四个0代表16个二进制位;
###		System.out.println(arr);	输出结果	
		//	[I@6d06d69c		
		//	[代表的是数组,几个就代表几维数组; I 代表数据类型为int; @符号是固定的; 6d06d69c代表16进制的地址值

#存储空间分配
	A://先进后出
		*存储局部变量
		局部变量:定义在方法声明上和方法中的变量;
	B:*存储new出来的数组或者对象
	C:方法区
		*面向对象部分讲解
	D:本地方法区
		*和系统相关;
	E:寄存器
		*给CPU使用

内存分配

//案例举例
//三个引用,两个数组
class Demo5_Array 
{
	public static void main(String[] args) 
	{
		int[] arr1 = new int[3];
		int[] arr2 = new int[5];
		int[] arr3 = arr2;	
		System.out.println(arr1);
		System.out.println(arr2);
		System.out.println(arr3);
		arr1[0] = 10;
		arr2[1] = 20;
		arr2[1] = 30;
		arr3[1] = 40;
		arr3[2] = 50;
		System.out.println(arr1[0]);
		System.out.println(arr1[1]);
		System.out.println(arr1[2]);
		System.out.println("----------------");
		System.out.println(arr2[0]);
		System.out.println(arr2[1]);
		System.out.println(arr2[2]);
		System.out.println(arr2[3]);
		System.out.println(arr2[4]);
		System.out.println("----------------");
		System.out.println(arr3[0]);
		System.out.println(arr3[1]);
		System.out.println(arr3[2]);
		System.out.println(arr3[3]);
		System.out.println(arr3[4]);
		}
}

//运行结果
---------- java ----------
[I@6d06d69c
[I@7852e922
[I@7852e922
10
0
0
----------------
0
40
50
0
0
----------------
0
40
50
0
0
/*
A:*静态初始化的格式:
	* 格式: 数据类型[] 数组名 = new 数据类型[]{元素1,元素2....};
	* 简化格式
		*数据类型[] 数组名 = {元素1 ,元素2,....}
B: *案例演示
	*对数组的解释;
	*输出数组名称和数组元素
*/
class Demo6_Array
{
	public static void main(String[] args) 
	{
		//int[] arr = new int[]{11,22,33,44,55};			可以先声明,再赋值
		int[] arr = {11,22,33,44,55};						//声明和赋值在同一行
		//int[] arr;
		//arr = new int[]{11,22,33,44,55};

		System.out.println(arr);
		System.out.println(arr[0]);
	}
}
数组操作注意事项:	
	a:ArrayIndexOutOfBoundsException:数组索引越界异常
	b:NullPointerException:空指针异常
	
class Demo7_Exception 
{
	public static void main(String[] args) 
	{
		int[] arr = new int[5];
		//System.out.println(arr[5]);	
      	//ArrayIndexOutOfBoundsException:数组索引越界异常	*原因:你访问了不存在的索引;

		arr = null;
		System.out.println(arr[0]);	//NullPointerException:空指针异常
		//当数组引用赋值为null,再去调用数组中的元素就会出现空指针异常.
	}
}
##数组遍历: 就是依次数组中的每一个元素;
  数组属性: arr length数组长度;
  数组的最大索引:arr,length-1;
  //数组的遍历
class Demo8_Array 
{
	public static void main(String[] args) 
	{
		int[] arr = {11,22,33,44,55};
		for (int i = 0; i < arr.length ;i++ )
		{
			System.out.println(arr[i]);
		}
		int[] arr2 = {3,4,5};
		print(arr2);
	}

	/*数组的遍历
	1.返回值为void;
	2.参数列表 int[] arr
	*/
	public static void print(int[] arr){
		for (int i = 0; i < arr.length ;i++ )
		{
			System.out.print(arr[i]);
		}
	}
}

//获取数组的最值
class Demo9_Array 
{
	public static void main(String[] args) 
	{
		int[] arr1 = {33,77,22,44,55};
		int max = getMax(arr1);
		System.out.print(max);
	}

	/*获取数组中的最大值
	1.返回值类型,int
	2.参数列表(int[] arr)
	*/
	public static int getMax(int[] arr){
		int max = arr[0];
		for (int i = 1;i < arr.length ;i++ )
		{
			if (max < arr[i])
			{
				max = arr[i];
			}
		}

		return max;
	}
}


//数组反转
class Demo10_Array 
{
	public static void main(String[] args) 
	{
		int[] arr1 = {11,22,33,44,55,66,77,88,99};
		reverseArray(arr1);
		print(arr1);	
	}
	//反转数组
	public static void reverseArray(int[] arr){
		for (int i = 0 ;i <= arr.length/2 ;i++)
		{
			int temp = arr[i];
			arr[i] = arr[arr.length-(i + 1)];
			arr[arr.length-(i + 1)] = temp;
		}
	}		
	//打印数组
	public static void print(int[] arr){
		for (int i = 0;i < arr.length ;i++ )
		{
			System.out.println(arr[i]);
		}
	}
}

// 数组查表法:根据键盘录入索引,查找对应星期
import java.util.Scanner;
class Demo11_Array
{
	public static void main(String[] args) 
	{
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入日期");
		int week = sc.nextInt();
		System.out.println("星期" + getWeek(week));
	}

	/*
	根据索引返回对应的星期
	1.返回值类型"char"
	2.参数列表(int week)
	*/

	public static char getWeek(int week){
		char[] arr = {' ', '一', '二', '三','四','五','六','日'};
		return arr[week];
	}

}

案例演示

/*
数组元素查找(查找指定元素第一次在数组中出现的位置)
*/
class Demo12_Array 
{
	public static void main(String[] args) 
	{
		int[] arr = {11,22,33,44,56,55,66,78,89,90};
		int index = getIndex(arr,80);
		System.out.println(index);
	}

	/*数组元素查找
	1.返回值类型int;
	2.参数列表( int[] arr,int value)
	*/

	public static int getIndex(int[] arr ,int value){
		for (int i = 0;i < arr.length ;i++ ){			//数组遍历
			if (arr[i] == value)						//如果数组中的元素与查找元素匹配
			{
				return i;
			}
		}
		return -1;
	}
}

二维数组

二维数组
A:格式

1.数据类型[][]  数组名 = new 数据类型[m][n];	//m代表有m个一维数组;n代表一维数组中有n个元素
2.数据类型[] 数组名[] = new 数据类型[m][n];

B:注意以下区分:

int x				
int y
int[] x;
int[] y[];
int[] x, y[];		//x是一维数组,y是二维数组
class Demo01_Array 
{
	public static void main(String[] args) 
	{
		int[][] arr = new int[3][2];
		/*
		[[I@6d06d69c			二维数组的地址值
		[I@7852e922				一维数组的地址值
		0
		*/

		System.out.println(arr);
		System.out.println(arr[0]);
		System.out.println(arr[0][0]);
	}
}

二维数组内存图

二维数组的第二种格式

//数组的默认值是null
class Demo03_Array 
{
	public static void main(String[] args) 
	{
		int[][] arr = new int[3][];			//这是一个二维数组,这个数组中有三个一维数组,三个一维数组都没有被初始化
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		System.out.println("-------------------");
		arr[0] = new int[3];				//第一个一维数组可以存储三个int值
		arr[1] = new int[5];
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
	}
}

输出结果:
		null
		null
		null
		-------------------
		[I@6d06d69c
		[I@7852e922
		null

二维数组的第三种格式

/*
二维数组的第三种格式
*A: 数组格式
		*int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};
*B: 二维数组格式3的解释
*/
class Demo04_Array 
{
	public static void main(String[] args) 
	{
		int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};		//这是一个二维数组,这个二维数组每个大括号都代表一个一维数组
		System.out.println(arr);
		System.out.println(arr[0]);
		System.out.println(arr[0][0]);

	}
}

二维数组格式3内存图png

二维数组的遍历

/*二维数组的遍历
* A:案例演示:
	*需求: 二维数组遍历;

	*外循环控制一位数组长度,其实就是一位数组的个数;
	*内循环控制的就是一位数组的长度;
*/
class Test1_Array
{
	public static void main(String[] args) 
	{
		int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};

		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();
		}
	}
}

二维数组的求和

/*二维数组求和
案例演示:
	需求: 公司年销售额求和;
	某公司按照季度和月份的数据如下:单位(万元)
	第一季度:22,66,44
	第二季度:77,33,88
	第三季度:25,45,65
	第四季度:11,66,99
*/
class Test2_Array
{
	public static void main(String[] args) 
	{
		int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}};
		int sum = add(arr);
		System.out.println("年销售总额是" + sum);
	}

	//二维数组求和
	public static int add(int[][] arr){
		int sum = 0;
		for (int i = 0;i < arr.length ;i++ )
		{
			for (int j = 0;j < arr[i].length ;j++ )
			{
				sum = sum + arr[i][j];
			}
		}
		return sum;
	}
}

参数传递问题

基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失

基本数据类型值传递

/*
基本数据类型的值传递,不改变原值,因为调用后就会弹栈,局部变量随之消失
引用数据类型的值传递,会改变原值,  因为即使方法弹栈,但堆内存数组对象还在,可以通过地址继续访问

Java到底是传值还是传址
1.既是传值也是传址,基本数据类型传递的是值,引用数据类型传址;
2,java中只有传值,因为地址值也是值	(面试答这种,支持者是高斯林(java之父))
*/
class Test4_Array 
{
	public static void main(String[] args) 
	{
		int a = 10;
		int b = 20;
		System.out.println("a:" + a + ",b:" + b);
		change(a,b);
		System.out.println("a:" + a + ",b:" + b);
	
		int[] arr = {1,2,3,4,5};
		change(arr);
		System.out.println(arr[1]);
		System.out.println(arr[3]);

	}

	public static void change(int a ,int b) {
		System.out.println("a:" + a + ",b:" + b);		 //a = 10,b = 20;
		a = b;											 //	a = 20
		b = a + b;										 // b = 40
		System.out.println("a:" + a + ",b:" + b);
	}

	public static void change(int[] arr){
		for (int x = 0 ;x < arr.length;x++)
		{
			if(arr[x] % 2 == 0) {
				arr[x] *= 2;
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43597282/article/details/88837805
今日推荐