流程控制
break结束多重循环
public static void main(String[] args) {
outer:
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 3; j++) {
System.out.println("i的值为:" + i + " j的值为:" + j);
if(j == 1) {
break outer;
}
}
}
}
//输出:
//i的值为:0 j的值为:0
//i的值为:0 j的值为:1
当运行到 break outer;
时,直接结束 outer 这个标签标识的循环。
Contine忽略多重循环
public static void main(String[] args) {
outer:
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 3; j++) {
System.out.println("i的值为:" + i + " j的值为:" + j);
if(j == 1) {
continue outer;
}
}
}
}
//输出
/*
i的值为:0 j的值为:0
i的值为:0 j的值为:1
i的值为:1 j的值为:0
i的值为:1 j的值为:1
i的值为:2 j的值为:0
i的值为:2 j的值为:1
i的值为:3 j的值为:0
i的值为:3 j的值为:1
i的值为:4 j的值为:0
i的值为:4 j的值为:1*/
与 break 类似,当运行到 continue outer;
时,直接跳过 outer 标签所标识循环的当次循环的剩下语句,重新开始下一次循环。
数组类型
基本使用
首先明确一点,数组是是引用类型。int[] a
中的 int[] 是引用类型,和 int、String 一样是一种数据类型, a 是引用变量,也就是指针。
Java 数组既可以存基本数据类型,也可以存引用类型。数组一旦初始化,内存空间就固定下来,长度无法改变。
数组初始化方式:
//静态初始化
//方式一
int[] intArr = {1, 2, 3, 4};
//方式二
Object[] objArr = new Object[]{1, "Java", 3, "hello"};
//动态初始化
int[] intArr = new int[5];
执行动态初始化时,只需指定空间大小,系统会自动分配初始值:
- byte、short、int 和 long,初始值为 0
- float、double,初始值为 0.0
- char,初始值为 u0000
- boolean,初始值为 false
- 引用类型(类、接口和数组),初始值为 null
根据索引访问数组,数组提供了一个 length 属性获取数组长度。
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3, 4};
//通过属性length获取数组长度,遍历数组
for(int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
//foreach遍历数组
//使用foreach进行迭代时,不要对临时变量a再次进行赋值
//因为迭代过程,只是对数组元素逐一拷贝赋给a,改变a的值,不会影响数组元素
for(int a : arr) {
System.out.println(a);
}
}
深入数组内存
数组是一种引用类型,数组引用变量和数组元素在内存里是分开存放的。实际的数组对象被存储在堆(heap)内存中;如果数组引用变量是一个局部变量,那么它被存储在栈(stack)内存中。
如果数组类型是基本类型,则堆内存中的数组元素存储的是基本类型数据;如果数组类型是引用类型,则堆内存中的数组元素存储的是对象的引用(地址),该引用又指向实际存储的对象,例如:有一个 Students 数组,里面存储两个 Student 对象 zhang 和 lee,内存分配如下图。如果堆内存中数组对象不再有任何引用变量执行它,内存会被 GC 回收。
public static void main(String[] args) {
int[] a = new int[]{1, 2, 3, 4};
int[] b = a;
//a和b指向的内存地址相同,指向同一个数组对象,改变b中元素,a也会变
System.out.println(a.hashCode()); //460141958
System.out.println(b.hashCode()); //460141958
}
多维数组
多维数组的本质是将一个数组的引用变量作为元素存储到另一个数组中。多维数组也是一种引用类型, int[][] a
中的 int[][]
也是一种数据类型,变量 a 是对元素为 int[] 类型的数组的引用。
//二维数组当一维数组使用,相当于定义了一个含有4个int[]类型引用的数组,初始化时元素存null
int[][] a = new int[4][];
int[][] b = new int[3][4];
//相当于下列代码,定义了一个含有3个int[]类型引用的数组,每个int[]数组大小为4,初始化时为0
int[][] b = new int[3][];
b[0] = new int[4];
b[1] = new int[4];
b[2] = new int[4];
//静态方式初始化二维数组
String[][] strArrays1 = new String[][] {
new String[3],
new String[]{"hello"}
};
String[][] strArray2 = {
new String[3],
new String[]{"hello"}
};