可现实中,幸福永远缺货
? ? ? ? ? ? ? ? ? ? ——24.1.17
1.内存:可以理解为“内存条”,所有的软件,程序运行起来都会进入到内存中,占用内存,在java的世界中,将内容划分成了5块
2.分为哪五块呢:
? ? ? ? ①栈(Stack)*
? ? ? ? ? ? ? ? 主要运行方法,方法的运行都会进栈内存运行,运行完毕之后,需要“弹栈”,为了向空间释放内存
? ? ? ? ②堆(Heap)*
? ? ? ? ? ? ? ? 保存的是对象,数组,每new依次,都会在堆内存中开辟空间,并为这个空间分配一个地址值,堆内存中的数据都是有默认值的
? ? ? ? ? ? ? ? 整数:0? ? ? ? 小数:0.0? ? ? ? 字符:'\u0000'? ? ? ? 布尔:false? ? ? ? 引用:null
? ? ? ? ③方法区 (Method Area)*
? ? ? ? ? ? ? ? 找到的“预备区”,记录了类和方法的信息
????????????????方法区中主要保存class文件以及其中的信息
? ? ? ? ? ? ? ? 代码运行之前,需要先进内存(方法区)
? ? ? ? ④本地方法栈(Native Method Stack):专门运行native方法(本地方法)
? ? ? ? ? ? ? ? 本地方法可以理解为堆对java功能的扩充
? ? ? ? ? ? ? ? 有很多功能,java语言实现不了,所以就需要依靠本地方法完成(C语言编写)
? ? ? ? ⑤寄存器(pc register):和CPU有关
public static void main(String[] args) {
int[] arr1 = new int[3];
System.out.println(arr1);
System.out.println(arr1[1]);
arr1[1] =100;
System.out.println(arr1[1]);
}
????????我们创建了两个数组,在堆内存中开辟了两个不同的空间,此时修改一个空间中的数据不会影响到另外一个空间的数据
public static void main(String[] args) {
int[] arr1 = new int[3];
System.out.println(arr1);
System.out.println(arr1[1]);
arr[1] =100;
System.out.println(arr1[1]);
int[] arr2 = new int[3];
System.out.println(arr2);//地址值
System.out.println(arr2[1]);
arr2[1] = 200;
System.out.println("arr1[1] = " + arr1[1]);
System.out.println("arr2[1] = " + arr2[1]);
}
????????arr2不是new出来的,是arr1直接赋值给的,arr1在内存中保存的是地址值,给了arr2,那么arr2的地址值和arr1意义,所以此时arr1和arr2指向了堆内存中的同一片空间(同一个地址值,表示同一个数组),此时改变一个数组中的元素会影响到另外一个数组
public static void main(String[] args) {
int[] arr1 = new int[3];
System.out.println(arr1);
arr1[1] =100;
int[] arr2 = arr1;
System.out.println(arr2);//地址值
arr2[1] = 200;
System.out.println("arr1[1] = " + arr1[1]);
System.out.println("arr2[1] = " + arr2[1]);
}
1.概述:数组中套了多个数组
2.定义格式:
? ? ? ? ①动态初始化
? ? ????????? ? 数据类型[ ][ ] 数组名 = new 数据类型[m][n]
? ? ? ????????? 数据类型 数组名[ ][?] = new 数据类型[m][n]
? ? ????????? ? 数据类型[ ] 数组名[ ] = new 数据类型[m][n]
? ? ? ? m代表的是二维数组的长度
? ? ? ? n代表的是二维数组中,一维数组的长度
? ? ? ? ? ? ? ? 数据类型[ ][ ] 数组名 = new 数据类型[m][ ] -> 二维数组中的一维数组没有被创建
? ? ? ? ②静态初始化
? ? ????????? ? 数据类型[ ][ ] 数组名 = new 数据类型[ ][ ]{{元素1,元素2,…},{元素1,元素2,…},…}
? ? ? ????????? 数据类型 数组名[ ][?] = new 数据类型[ ][ ]{{元素1,元素2,…},{元素1,元素2,…},…}
? ? ????????? ? 数据类型[ ] 数组名[ ] = new 数据类型[ ][ ]{{元素1,元素2,…},{元素1,元素2,…},…}
? ? ? ? ③简化的静态初始化
????????????????数据类型[ ][ ] 数组名 = {{元素1,元素2,…},{元素1,元素2,…},…}
????????????????数据类型 数组名[ ][?] = {{元素1,元素2,…},{元素1,元素2,…},…}
????????????????数据类型[ ] 数组名[ ] = {{元素1,元素2,…},{元素1,元素2,…},…}
public static void main(String[] args) {
int[][] arr1 = new int[2][2];
int[][] arr2 = new int[2][];
System.out.println();
String[][] arr3 = {{"唐僧","孙悟空","猪八戒","沙和尚"},{"刘备","关羽","张飞"},{"宋江"},{"贾宝玉","林黛玉"}};
}
注:动态初始化数组长度必须定死,静态初始化数组长度不用定义好,每一个一维数组的长度根据实际存储的数据数来确定
1.格式:
????????数组名.length
?2.获取每一个一维数组长度,需要先遍历二维数组,将每一个一维数组遍历出来
public static void main(String[] args) {
String[][] arr1 = {{"唐僧","孙悟空","猪八戒","沙和尚"},{"刘备","关羽","张飞"},{"宋江"},{"贾宝玉","林黛玉"}};
for (int i = 0; i < arr1.length; i++) {
//获取每一个一维数组的长度
System.out.println(arr1[i].length);
}
}
获取
①格式:
? ? ? ? 数组名[i][j]
? ? ? ? i:代表的是一维数组在二维数组中的索引位置
? ? ? ? j:代表的是元素在一维数组中的索引位置
public static void main(String[] args) {
//获取二维数组中的元素
String[][] arr1 = {{"唐僧","孙悟空","猪八戒","沙和尚"},{"刘备","关羽","张飞"},{"宋江"},{"贾宝玉","林黛玉"}};
System.out.println(arr1[0][1]);
System.out.println(arr1[1][0]);
System.out.println(arr1[2][0]);
System.out.println(arr1[3][0]);
}
存储
①格式:
? ? ? ? 数组名[i][j] = 值
i:代表的是一维数组在二维数组中的索引位置
j:代表的是元素在一维数组中的索引位置
多行列数对齐操作:ALT键不放鼠标下拉
遍历
①先遍历二维数组,将每一个一维数组遍历出来
②在遍历每一个一维数组,将元素获取出来
public static void main(String[] args) {
String[][] arr1 = {{"唐僧","孙悟空","猪八戒","沙和尚"},{"刘备","关羽","张飞"},{"宋江"},{"贾宝玉","林黛玉"}};
for (int i = 0; i < arr1.length; i++) {
//获取每一个一维数组的长度
System.out.print(arr1[i].length +" ");
for (int j = 0; j < arr1[i].length; j++) {
System.out.print(arr1[i][j]+" ");
}
System.out.println();
}
}