静态:int[] arr = {1,2,3,4,5};
动态:int[] arr = new int[] {1,2,3,4,5}; 或者像这样: int[] arr = new int[5]; 开辟5个整数内存空间。
注意:int[]是该变量的类型名。 这是一个静态声明。 直接在花括号中给出的数组没有新的空格。 这样的声明根据花括号中的元素数量确定数组。 尺寸; new int[5]会在堆上创建5个int类型的内存空间,并初始化为0。数组一旦创建,它的数组长度就确定了,不能改变。 只能修改数组中的元素。
java中允许长度为0的数组,new[0]。 您将来可能会遇到这种形式。 请记住,长度为 0 的数组和 null 是有区别的! ! !
请记住:arr 变量名是堆栈上的一个空格。 而new int[]是堆上的一个空间。 arr 只存储该空间的第一个元素在堆上的地址。
3. 访问数组元素
前面数组的下限范围是0~4,而不是1~5。数组创建完成后,就可以向数组填充元素了,如下
int[] arr = new int[0];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
数值类型的数组将被初始化为 0,数组将被初始化为 false,引用类型的数组将被初始化为 null 而不是空字符串。
如果下标不在数组下标范围内,就会出现数组越界异常。
int[] arr = new int[5];
for (int i = 0; i < 6; i++) {
arr[i] = i; //此时下标i会变成5,arr[5]就会越界
}
因此,Java自带了获取数组长度的方法,即数组名。 它可以自动获取数组的长度。 除了这种访问方式之外,我们还有一个增强的for循环。如下
int[] arr = {1,2,3,4,5};
for (int data : arr) {
System.out.println(data);
}
这种循环不需要考虑指定的下标值。 格式为(元素类型元素:数组名称)。 元素类型是指:这个数组中存储的元素的类型; :这里会暂时存放数组的各个元素,用于直接打印或者其他事情; 数组名:是需要操作的对象。
这个循环应该是“for every in arr”。 增强的for循环语句更简洁,更不容易出错,因为你不必担心下标的起始值和结束值。
注意:增强for循环语句中的循环变量将遍历数组的每个元素而不是下标值。
提示:有一种更简单的方法可以使用类中的方法来打印数组中的所有值。 调用 .(arr) 返回一个包含数组元素的字符串,这些元素括在括号中并用逗号分隔。
4. 数组复制与排序 and
请问,这算不算复制数组?
int[] arr1 = {1,2,3,4,5,6,7,8,9};
int[] arr2 = arr1; //这样算拷贝了吗?
其实不是,仔细看看上面声明的数组的内存映射。 我们知道arr1实际上只存储了一个内存地址。 我们直接把这个地址赋给arr2。 此时实现的效果就是arr1和arr2。 两个变量都指向相同的内存空间,并且不会复制新的变量。 大批。
复制方法:
.(复制的数组,新数组的长度),返回值是新数组的地址。
int[] arr = {1,2,3,4,5};
int[] newArr = Arrays.copyOf(arr, 5);
此时我们再深入一点,.(),底层是如何实现的呢?
.(),底层调用了.(),这个方法被修改了。 也称为本机方法。
问:这是什么?
答:JVM是基于C++实现的程序。 Java程序在执行过程中,本质上是需要调用C++提供的一些函数来与底层操作系统进行交互的。 因此,一些用C++实现的函数在Java开发中也会被调用。这里的方法是指这些用C++实现的函数,然后被Java调用
.(要复制的数组,左下标,右下标)。 记住这里复制的范围是[左下标,右下标),也就是说,这是左闭右开区间。
·
要对数组中的元素进行排序,也可以使用里面的sort方法。 该方法使用优化的快速排序算法。 快速排序算法对于大多数数据集来说相对有效。
.sort(排序数组)。 (升序)
深拷贝和浅拷贝的区别
上面,我们已经讲完了数组的副本。 你有没有想过上面的拷贝是深拷贝还是浅拷贝?
什么是深拷贝? 什么是浅拷贝?
深拷贝是指:我拷贝一份数据后,一份是原始数据,一份是复制后的数据。 如果此时我们修改复制的数据,看看是否会影响原来数据的内容。 如果不影响原始数据的内容,则为深拷贝。 相反的是浅拷贝。 例子:
如上图所示,上面复制的数据是基本数据类型。 因此,复制后,数据存储在新的内存区域中。 这时,如果我们修改指向的内存空间中的数据,并不会影响 arr 数组的数据。 这时候我们称之为深拷贝。
这时如果修改s字符串的内容,newS字符串的内容也会被修改。 这是一个浅拷贝。
总结:当面试官问你拷贝的数据是深拷贝还是浅拷贝时。 该怎么回答呢?
被复制的对象是什么?
假设1:引用数据类型:简单地使用copy方法进行复制就是浅复制。 如果copy方法本身处理深复制的情况,那么它就是深复制。
假设2:基本数据类型:深拷贝。
5、二维数组及存储形式
二维数组,也称为矩阵。 可以使用两个下标值来访问它。 二维数组的本质实际上是一个一维数组,由一维数组组成。
在Java中,声明二维数组非常简单,如下:
int[][] array1 = new int[3][]; //合法的
int[][] array2 = new int[3][3];
它类似于一维数组的声明。 但这里需要注意的是:在C语言中,二维数组的声明中可以省略行大小,但在Java中,只能省略列大小。
二维数组的存储形式:与C语言中二维数组的存储形式不同。
C语言二维数组内存区域:
遍历二维数组,遍历一维数组的方法其实是类似的:
//普通for循环
int[][] array = {{1,2,3},{4,5,6},{7,8,9}};
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
System.out.print(array[i][j] + " ");
}
}
//增强for循环
int[][] array = {{1,2,3},{4,5,6},{7,8,9}};
for (int[] row : array) { //此时每一个元素,其实就是一个 一维数组。 对比上面的内存分布图
for (int data : row) {
System.out.print(data + " ");
}
}
将元素转换为字符串并像一维数组一样输出。 .() . 这不再有效,这只适用于一维数组。 二维数组应该这样玩:
//字符串形式输出
int[][] array = {{1,2,3},{4,5,6},{7,8,9}};
System.out.println(Arrays.deepToString(array));
好了,本次更新就到此结束,小伙伴们,我们下期再见! ! !