1、数组是什么
数组是一个固定长度的容器,可以存放同一类型的数据。我们可以通过数组的索引来操作数组,如:获取数组数据、修改数据、删除数据等等。数组是一种数据类型,准确来说,数组是一种引用类型,如int是一种基本类型,而定义数组的int[] 类型是一种引用类型。
2、数组的定义与初始化
2.1、数组的定义
数组的定义方式很简单,格式是type[] array,如int[] arr1,意思是定义一个数组名为arr1的整型数组。因为数组是一种引用类型,所以定义一个数组仅仅是定义一个引用变量(也就是一个指针,尽管Java去掉了指针的概念),如果该数组进行了初始化,那么该引用变量将指向堆内存的某一块区域。
2.2、数组的静态初始化
初始化时由我们显式地指定数组元素的值,由系统决定数组长度。
/**
* @author RuiMing Lin
* @date 2020-03-18 13:35
*/
public class Demo1 {
public static void main(String[] args) {
// 1.定义一个名字为colors的数组
String[] colors;
// 2.对数组进行显式初始化
colors = new String[]{"yellow", "red" , "green" , "orange"};
// 3.输出数组的长度
System.out.println(color.length);
}
}
或者可以简化的初始化方式:
// 简化的静态初始化方式
String[] colors_1 = new String[]{"yellow", "red" , "green" , "orange"};
String[] colors_2 = {"yellow", "red" , "green" , "orange"};
2.3、动态初始化
我们只指定数组的长度,由系统为每个数组元素指定初始值:
// 定义一个长度为10的字符串数组
String[] colors = new String[10];
3、数组的操作
3.1、数组的索引和长度
在我们对数组进行初始化后,计算机会根据数组的长度和存储的数据类型在磁盘开辟一段连续的空间。每一个数据按顺序会有一个属于自己的编号,从0开始,到数组长度减一,这个编号就是数组的索引。
数组有一个内置的属性:length,它可以用来获取数组的长度。
/**
* @author RuiMing Lin
* @date 2020-03-18 13:35
*/
public class Demo1 {
public static void main(String[] args) {
// 定义一个数组
int[] num = new int[]{0,1,2,3,4,5,6,7,8,9};
// 根据索引获取数据
System.out.println(num[2]);
// 根据索引修改数据
num[2] = 10;
System.out.println(num[2]);
// 输出数组的长度
System.out.println(num.length);
}
}
3.2、数组的遍历
数组的遍历有多种形式,这里介绍两种常用的方式:
如果我们是使用IDEA写代码,我们可以使用快捷键进行数组操作!
/**
* @author RuiMing Lin
* @date 2020-03-18 13:35
*/
public class Demo1 {
public static void main(String[] args) {
// 定义一个数组
int[] num = new int[]{0,1,2,3,4,5,6,7,8,9};
// 遍历方式一:IDEA快捷键:num.fori
for (int i = 0; i < num.length; i++) {
System.out.println(num[i]);
}
// 遍历方式二:IDEA快捷键:num.for
for (int i : num) {
System.out.println(i);
}
}
}
3.3、获取数组最大值
/**
* @author RuiMing Lin
* @date 2020-03-18 13:35
*/
public class Demo1 {
public static void main(String[] args) {
// 定义一个数组
int[] num = new int[]{0,10,2,30,4,56,6,17,8,29};
int max = num[0];
//遍历数组,取出每个元素
for (int i = 0; i < num.length; i++) {
if (num[i] > max) {
max = num[i];
}
}
System.out.println("数组最大值是: " + max);
}
}
3.4、反转数组
/**
* @author RuiMing Lin
* @date 2020-03-18 13:35
*/
public class Demo1 {
public static void main(String[] args) {
// 定义一个数组
int[] num = new int[]{0,10,2,30,4,56,6,17,8,29};
for (int min = 0, max = num.length - 1; min <= max; min++, max--) {
//利用临时变量完成数组中的元素交换
int temp = num[min];
num[min] = num[max];
num[max] = temp;
}
// 反转后,遍历数组
for (int i = 0; i < num.length; i++) {
System.out.println(num[i]);
}
}
}
4、数组工具类Arrays
java.utils包提供了一个数组操作类,用来简化数组的操作。常用的类有复制数组、比较数组、对数组进行排序、讲数组转化为字符串等等。
import java.util.Arrays;
/**
* @author RuiMing Lin
* @date 2020-03-18 13:35
*/
public class Demo1 {
public static void main(String[] args) {
// 定义一个数组
int[] nums = new int[]{0,10,2,30,4,56,6,17,8,29};
// 对数组进行排序
Arrays.sort(nums);
// 将数组转化为字符串进行输出
System.out.println("nums = " + Arrays.toString(nums));
// 复制数组
int[] newNums = Arrays.copyOf(nums, nums.length);
System.out.println(nums == newNums);// 判断两个数组是否是同一个,答案是false
}
}
5、数组的内存模型
5.1、一维数组
当我们定义一个数组时(尚未初始化),系统在内存栈区开辟一个空间存放这个引用变量。当我们对数组进行初始化后,系统在堆内存开辟一块空间进行存储。
5.2、二维数组
严格来说,Java并没有二维数组,只是看起来像二维数组。二维数组的实质,只是现在栈内存定义一个引用变量,指向堆内存的另一组引用变量,而堆内存的引用变量在指向存储的数据。
5.3、总结
当我们定义一个变量时,在我们未对其赋值或者系统自动对其赋值前,仅仅只是在栈内存定义一个变量名。此时变量名的作用就像是指针一样,当实现对其赋值时,系统会在堆内存开辟一片空间存放数据,变量就会指向那片数据区域。