数组的基本用法
创建数组
基本语法:
// 动态初始化数据类型 [] 数组名称 = new 数据类型 [] { 初始化数据 };// 静态初始化数据类型 [] 数组名称 = { 初始化数据 };
代码示例:
int[] array1 = {1,2,3,4,5};
int[] array2 = new int[]{1,2,3,4,5};
int[] array3 = new int[5];
array3 = new int[]{1,2,3,4,5};
数组的使用
int[] array = {1,2,3,4,5};
Systrm.out.println(array.length); //打印数组的长度
//获取数组中的元素
array[1] = 6; //将下标为1位置的数更换为6
注意事项
遍历数组
int[] arr = {1, 2, 3};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
//输出结果为:1,2,3
使用 for - each 循环来遍历数组,也叫做增强循环。
int[] array = {1,2,3,4,5,6};
for(int x : array){
System.out.println(x);
}
数组作为方法的参数进行传参
代码示例:
public static void printArray(int[] a) {
for (int x : a) {
System.out.println(x);
}
}
public static void main(String[] args) {
int[] arr = {1, 2, 3};
printArray(arr);
}
该代码就是利用数组的传参来进行遍历数组
- int[] a 是方法的形参, int[] arr 是方法实参
- 如果需要获取到数组长度, 同样可以使用 a.length
理解引用类型
代码示例:
public static void main(String[] args) {
int num = 0;
func(num);
System.out.println("num = " + num);
}
public static void func(int x) {
x = 10;
System.out.println("x = " + x);
}
在 main 方法中调用方法 func() 的时候会创建一个 func() 的栈帧,变量 X 是在 func() 中创建的,在调用完之后就销毁了,所以并不影响 main() 方法里面的变量。
参数传参数组类型
代码示例:
public static void main(String[] args) {
int[] arr = {1, 2, 3};
func(arr);
System.out.println("arr[0] = " + arr[0]);
}
public static void func(int[] a) {
a[0] = 10;
System.out.println("a[0] = " + a[0]);
}
我们来简易画一下该代码的调用图:
我们可以看到在传参之后 arr 和 a 都指向了堆中的该数组。因此我们可以用 a 来改变数组里面的内容
初识 JVM 内存区域划分
- 程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址。
- 虚拟机栈(JVM Stack): 重点是存储局部变量表(当然也有其他信息). 我们刚才创建的 int[] arr 这样的存储地址的引用就是在这里保存。
- 本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似. 只不过保存的内容是Native方法的局 部变量. 在有些版本的 JVM 实现中(例如HotSpot), 本地方法栈和虚拟机栈是一起的。
- 堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存 (例如前面的 new int[]{1, 2, 3} )。
- 方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数 据. 方法编译出的的字节码就是保存在这个区域。
- 运行时常量池(Runtime Constant Pool): 是方法区的一部分, 存放字面量(字符串常量)与符号引用. (注意 从 JDK 1.7 开始, 运行时常量池在堆上)。
数组作为方法的返回值
public static int[] func1(int[] array,int key){
for (int i = 0; i < array.length-1; i++) {
for (int j = 0; j < array.length; j++) {
if(i != j && array[i] + array[j] == key){
return new int[]{i,j};
}
}
}
return new int[]{-1,-1};
}
public static void main(String[] args) {
int[] array = {2,7,11,15};
int[] b = func1(array,9);
System.out.println(Arrays.toString(b));
}
该代码的含义是在 array 数组中找到两个相加等于 9 的数的下标,并作为方法的返回值一次性将两个下标通过数组来返回出来。
java.util.Arrays 包
我们来讲解一下关于 java.util.Arrays 这个包中的一些方法的使用。
数组转字符串
代码示例:
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6};
String str = Arrays.toString(array);
System.out.println(str);
}
我们通过 Arrays.toString() 该方法将一个数组转换成一个字符串了,最后将该字符串输出。
数组拷贝
代码示例:
public static void main(String[] args) {
int[] array1 = {1,2,3,4,5,6};
int[] array2 = new int[array1.length];
array2 = Arrays.copyOf(array1,array1.length);
System.out.println(Arrays.toString(array2));
}
我们利用 Arrays.copyOf() 方法将数组 array1 里面的内容拷贝到了 array2 里面。
范围拷贝:
代码示例:
public static void main(String[] args) {
int[] array1 = {1,2,3,4,5};
int[] array2 = new int[array1.length];
array2 = Arrays.copyOfRange(array1,1,3);
System.out.println(Arrays.toString(array2));
}
我们利用 copyOfRange() 方法将数组 array1 的一部分拷贝到数组 array2 中。
查找数组中指定元素(二分查找)
代码示例:
public static void main(String[] args) {
int[] array = {1,2,3,4,5,6,7,8};
int a = Arrays.binarySearch(array,4);
System.out.println(a);
}
我们利用 binarySearch() 方法查找到数组 array 中指定的一个数,并返回下标。如果没有找到则返回一个负数。
数组排序
代码示例:
public static void main(String[] args) {
int[] array = {5,3,7,9,2,4,6,7,2};
Arrays.sort(array);
System.out.println(Arrays.toString(array));
}
我们利用 sort() 方法将一个乱序的数组从小到大排序出来。
判断两个数组是否相等
代码示例:
public static void main(String[] args) {
int[] array1 = {1,2,3,4,5};
int[] array2 = {1,2,3,4,5};
boolean f = Arrays.equals(array1,array2);
System.out.println(f);
}
我们用方法 equqls() 来判断两个数组是否相等。如果相等则返回一个布尔值 true ,不相等返回false。
二维数组
数据类型 [][] 数组名称 = new 数据类型 [ 行数 ][ 列数 ] { 初始化数据 };
代码示例:
int[][] array1 = {{1,2,3},{4,5,6}};
int[][] array2 = new int[][]{{1,2,3},{4,5,6}};
int[][] array3 = new int[2][];
将二维数组转换成字符串
代码示例:
public static void main(String[] args) {
int[][] array = {{1, 2, 3}, {4, 5, 6}};
System.out.println(Arrays.deepToString(array));
}
运行结果为:
遍历二维数组
public static void main(String[] args) {
int[][] array = {{1, 2, 3}, {4, 5, 6}};
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j]);
}
System.out.println();
}
}
array.length 是数组 array 的行数,array[i].length 是数组 array 第 i 行的列数。
在Java中是允许不规则的二维数组出现的:
public static void main(String[] args) {
int[][] array = {{1, 2, 3}, {4, 5, 6,7},{8,9,10,11,12,13,14}};
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j]+" ");
}
System.out.println();
}
}
输出为: