数组、栈、堆(java基础知识五)
1.数组概述、定义格式
* A:数组概念 数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。 数组既可以存储基本数据类型,也可以存储引用数据类型。 * B:数组定义格式 格式1:数据类型[] 数组名;----int[] arr; 格式2:数据类型 数组名[];----int arr[]; * C:数组是存储多个变量(元素)的东西(容器),这多个变量的数据类型要一致,
2.数组初始化、动态初始化
* A:什么是数组的初始化 Java中的数组必须先初始化,然后才能使用。 所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。 * B:如何对数组进行初始化 * a:动态初始化 -- 只指定长度,由系统给出初始化值 * 格式: 数据类型[] 数组名 = new 数据类型[5]; * int[] arr = new int[3]; 解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。 * b:静态初始化 -- 给出初始化值,由系统决定长度 * 格式: 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…}; * 初始化时指定每个数组元素的初始值,由系统决定数组长度。 * int[] arr = {1,2,3,4,5,6,7,8,9,0}; * C:动态初始化的格式: * 数据类型[] 数组名 = new 数据类型[数组长度]; * 数组长度其实就是数组中元素的个数。 * D:案例演示 * 对数组的解释 * 输出数组名称和数组元素 * E:数组的长度格式 * 数组名.length
3.java内存分配,栈、堆区别
* A:栈---存储局部变量, * B:堆---储存new出来的东西,在堆内new出来的对象都有初始化值。 * C:方法区 * D:本地方法区 * E:寄存器 1:局部变量 a:方法定义中或者方法声明上(例如:形参)的所有变量 b:使用完毕,立即消失 2:new出来的东西---------实体,对象。 new int[3]; a:每一个实体都有首地址值 b:每一个实体内的数据都有默认值 byte,short,int,long --------0 float,double -----------------0.0 char ‘\u0000’----------------Unicode编码,0为十六进制的数 boolean false 引用类型:null c:使用完毕后,会被垃圾回收器空闲的时候回收。
4.数组静态初始化
* A:静态初始化的格式: * 格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2,…}; * 简化格式: * 数据类型[] 数组名 = {元素1,元素2,…};
5.数组操作的两个常见小问题越界和空指针
* a:ArrayIndexOutOfBoundsException:数组索引越界异常 * 原因:你访问了不存在的索引。 * b:NullPointerException:空指针异常 * 原因:数组已经不在指向堆内存了。而你还用数组名去访问元素。
6.数组演示操作
数组遍历:就是依次输出数组中的每一个元素。 int[] arr={1,2,3,4,5,6,7,8}; for(int x=0;x<arr.length;x++){ System.out.println(arr[x]); }
数组获取最值(获取数组中的最大值最小值) public static int getMax(int[] arr){ int[] arr={1,2,3,4,5,6,7,8}; int max=arr[0]; for(int x=1;x<arr.length;x++){ if(max<arr[x]){ max=arr[x]; } } System.out.println(max); }
数组元素反转(倒序有俩种方法)(就是把元素对调) 1.public static void niXu(){ int[] arr={1,2,3,4,5,6,7,8}; for(int start=0,end=arr.length-1;start<end;start++,end--){ int temp=arr[start]; arr[start]=arr[end]; arr[end]=temp; } } 2.public static void niXu2(){ int[] arr={1,2,3,4,5,6,7,8}; 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; } }
数组查表法(根据键盘录入索引,查找对应星期) import java.util.Scanner; class DemoChaBiao { public static void main(String[] args) { /* 需求: 数组查表法(根据键盘录入索引,查找对应星期) 分析: 从键盘输入一个数, */ //创建对象 Scanner sc = new Scanner(System.in); //键盘录入一个数 int x=sc.nextInt(); //定义一个char类型的数组 char[] arr={' ','一','二','三','四','五','六','日'}; char c=getWeek(x,arr); System.out.println(c); System.out.println("Hello World!"); } //定义返回星期几字符方法,返回值类型char,参数列表int x,char[] arr public static char getWeek(int x,char[] arr){ char c = arr[x]; return c; } }
数组元素查找(查找指定元素第一次在数组中出现的索引) import java.util.Scanner; class DemoIsEquals { public static void main(String[] args) { /* 需求: 数组元素查找(查找指定元素第一次在数组中出现的索引) 分析: 1.元素的遍历, 2.比较数组元素与给出的值是否相等 3.输出 */ int[] arr={1,2,3,4,5,6}; Scanner sc = new Scanner(System.in); int x = sc.nextInt(); int b=isEquals(x,arr); System.out.println(b); System.out.println("Hello World!"); } //定义方法,返回值类型boolean,参数列表 int x ,int[]arr public static int isEquals(int x,int[] arr){ //for循环用来遍历和比较,看是否满足数组元素的值是否与输入的数据相等,相等返回索引,不相等返回-1 for (int i= 0 ;i<arr.length ;i++ ) { if (x==arr[i]) { return i; } } return -1; } }
7.二维数组的概述及其格式
* A:二维数组概述 * B:二维数组格式1 * 数据类型[][] 数组名 = new 数据类型[m][n]; * int[][] arr= new int[m][n]; * C:二维数组格式1的解释 *这是一个二维数组,它里面有m个一维数组,每一个一维数组中都有n个元素, * D:注意事项 * a:以下格式也可以表示二维数组 * 1:数据类型 数组名[][] = new 数据类型[m][n]; * 2:数据类型[] 数组名[] = new 数据类型[m][n]; * B:注意下面定义的区别 int x; int y; int x,y; int[] x; int[] y[]; int[] x,y[];
* A:二维数组格式2 * 数据类型[][] 数组名 = new 数据类型[m][]; * int[][] arr = new int[3][]; * arr[0] = new int[2]; * arr[1] = new int[3] * arr[2] = new int[1];
* A:二维数组格式3 * 数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}}; * 简化版格式: * 数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
8.二维数组演示
需求:二维数组遍历 int[][] arr={{1,2,3,4},{2,3,4,5}}; for(int x=0;x<arr.length;x++){ for(int y=0;y<arr.length;y++){ System.out.println(arr[x][y]); } }
需求:公司年销售额求和 某公司按照季度和月份统计的数据如下:单位(万元) 第一季度:22,66,44 第二季度:77,33,88 第三季度:25,45,65 第四季度:11,66,99 class Demo2Array2 { public static void main(String[] args) { int[][] arr={{22,66,44},{77,33,88},{25,45,65},{11,66,99}}; int sum=0; for (int x=0;x<arr.length ;x++ ) { for (int y=0;y<arr[x].length ;y++ ) { sum+=arr[x][y]; } } System.out.println(sum); System.out.println("Hello World!"); }
看程序写结果,并画内存图解释 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]); } public static void change(int a,int b) { System.out.println("a:"+a+",b:"+b); a = b; b = a + b; 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; } } } 总结:Java中到底是传值还是传址? 1,Java中即传值也传址,基本数据类型传的是值,引用数据类型传的是址(地址) 2,Java中是传值,非传址,因为地址值也是值(高司令支持)