嵌套循环
形式:在for,while,do...while的循环体语句中,还有另一个循环(for,while,do...while) 运行口诀:外循环循环一次,内循环循环一轮
数组的声明与初始化
数组的声明:
//推荐
元素的数据类型[] 二维数组的名称;
//不推荐
元素的数据类型 二维数组名[];
方式一:静态初始化
- 格式:
数据类型[] 数组名 = {元素1,元素2,元素3...};//必须在一个语句中完成,不能分开两个语句写
- 举例:
定义存储1,2,3,4,5整数的数组容器
int[] arr = {1,2,3,4,5};//正确
int[] arr;
arr = {1,2,3,4,5};//错误
方式二:静态初始化
- 格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
或
数据类型[] 数组名;
数组名 = new 数据类型[]{元素1,元素2,元素3...};
- 举例:
定义存储1,2,3,4,5整数的数组容器。
int[] arr = new int[]{1,2,3,4,5};//正确
int[] arr;
arr = new int[]{1,2,3,4,5};//正确
int[] arr = new int[5]{1,2,3,4,5};//错误的,后面有{}指定元素列表,就不需要在[长度]指定长度。
方式三:动态初始化
- 格式:
数组存储的元素的数据类型[] 数组名字 = new 数组存储的元素的数据类型[长度];
或
数组存储的数据类型[] 数组名字;
数组名字 = new 数组存储的数据类型[长度];
- 数组定义格式详解:
- 数组存储的元素的数据类型: 创建的数组容器可以存储什么数据类型的数据。
- 元素的类型可以是任意的Java的数据类型。例如:int, String, Student等
- [] : 表示数组。
- 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。
- new:关键字,创建数组使用的关键字。因为数组本身是引用数据类型,所以要用new创建数组对象。
- [长度]:数组的长度,表示数组容器中可以存储多少个元素。
- 注意:数组有定长特性,长度一旦指定,不可更改。
数组的遍历
- 数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为:
数组名.length,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为数组名.length-1。 - 数组遍历: 就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5};
//打印数组的属性,输出结果是5
System.out.println("数组的长度:" + arr.length);
//遍历输出数组中的元素
System.out.println("数组的元素有:");
for(int i=0; i<arr.length; i++){
System.out.println(arr[i]);
}
}
idea中快捷键itar可以快速生成遍历循环
数组的内存分析
Java程序是在JVM中运行的。
JVM把内存分为几个部分:
- Java方法栈:用来存储方法中的局部变量,例如main方法的局部变量
- 堆(用来存储new出来的对象)
- 本地方法栈,他是Java调用C语言的代码时需要使用的内存
- 方法区,用来加载存储的类、静态数据、常量等
- 程序计数器,用来记录每一个线程的下一条指令
数组的元素时存储在一块连续的空间中,每一个元素是相邻的
数组元素的数据类型,决定了每一个元素占的内存大小
例如:int类型是4个字节
JVM会给每一个字节的内存都进行编号,数组的内存空间是连续的,因此只要记录第一个元素的第一个字节的内存的地址即可
由于Java运行在JVM上,所以实际上我们是无法获得真正的地址的。
数组名这个变量中,存储的就是所有数组元素的首地址。
我们直接打印数组名显示的结果类似于:[I@4554617c
我们可以将它砍成是内存地址,但本质上不是。
因为Java是不对外暴漏内存地址的。这个东西它代表的是:
[:表示以为数组,如果是[[:表示二维数组
I:表示元素是int类型
@:是一个连接符
4554617c:是数组对象HashCode值,前面这个HashCode不用关心,后面如果需要把对象放到散列数据结构(hashtable)中去,4554647c可以比喻成对象的身份证号。
public class Exam1 {
public static void main(String[] args) {
int[] arr = new int[5];
System.out.println(arr[4]);
}
}
//它的运行结果是
//0
下标
如果要访问某个元素,需要通过数组名[下标] 的格式。
数组名:获取首地址
[下标]:这个元素,距离首地址间隔几个元素,单元格
第一个元素,距离首地址间隔0个元素/单元格
第二个元素,距离收低值间隔1个元素/单元格
public static void main(String[] args){
int a = 1;//这个a是局部变量,存储在“栈”中
int[] arr = new int[5];//new出来的部分存储在“堆”中,arr也是局部变量,存储在“栈”中
System.out.println("----------");
int arr1 = {1,2,3,4,5};
System.out.println(arr1);//[I@4554617c
System.out.println("----------");
int[] arr2 = new int[5];
}
因为数组可以通过[下标]直接访问到某个元素,因此它的访问效率是很高的
new这个关键字的意思是:申请一块内存空间。
所以,数组在初始化时,必须指定元素的类型和长度。只有知道了元素类型和长度,JVM才能知道需要给你分配多大的空间。