目录
一、什么是数组
1.为什么要使用数组
如果我要存三个同学的成绩,那么我会书写如下代码:
public class TestStudent{
public static void main(String[] args){
int score1 = 70;
int score2 = 80;
int score3 = 85;
System.out.println(score1);
System.out.println(score2);
System.out.println(score3);
}
}
那么我们会发现有很多重复的地方,而且很麻烦,每一个都要书写一遍,还不好管理。那有没有一种东西,可以把它们都给装到一个东西里面去,更好的书写并管理它们呢?
答:有,那就是数组!
2.什么是数组
数组就是把相同类型的变量储存在一个地方里面。它可以大大减少书写的次数,还方便管理。它就像一个车库,都有着自己的代号(也就是下标)可以方便我们管理。
在Java中,如果有六个相同类型的元素,就相当于上图的六个车位。可以看出:
1. 数组中存放的元素其类型相同
2. 数组的空间是连在一起的
3. 每个空间有自己的编号,起始位置的编号为0,即数组的下标。
那数组要这么使用呢?请继续往下看:
二、数组的基本用法
1.数组的创建
T[] 数组名 = new T[N];
T:表示数组中存放元素的类型
T[]:表示数组的类型
N:表示数组的长度
int[] array1 = new int[10]; // 创建一个可以容纳10个int类型元素的数组
double[] array2 = new double[5]; // 创建一个可以容纳5个double类型元素的数组
String[] array3 = new double[3]; // 创建一个可以容纳3个字符串元素的数组
2.数组的初始化
数组的初始化主要分为动态初始化以及静态初始化。
1. 动态初始化:在创建数组时,直接指定数组中元素的个数
int[] array = new int[10];
double[] array2 = new double[5];
String[] arr3 = new String[3];
int[] array4 = new int[]//报错,没有指定元素的个数
请注意:动态初始化不指定元素个数会报错!
2. 静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定
int[] array1 = new int[]{0,1,2,3,4,5,6,7,8,9};
double[] array2 = new double[]{1.0, 2.0, 3.0, 4.0, 5.0};
String[] array3 = new String[]{"hell", "Java", "!!!"};
int[] array1 = new int[10]{0,1,2,3,4,5,6,7,8,9};//报错,指定了元素的个数
请注意:静态初始化指定元素个数会报错!
静态和动态初始化也可以分为两步,但是省略格式不可以。
int[] array1;
array1 = new int[10];
int[] array2;
array2 = new int[]{10, 20, 30};
//下面报错,注意省略格式不可以拆分, 否则编译失败
int[] array3;
array3 = {1, 2, 3};
3.初始化后的默认值
如果没有对数组进行初始化,数组中元素有其默认值,如下:
如果数组中存储元素类型为引用类型,默认值为null。比如说String或者是数组什么的。
4.数组的访问
数组的内容在内存中是一段连续的空间,下标是从0开始,依次增加,可以通过下标来访问数组的内容。
int[]array = new int[]{10, 20, 30, 40, 50};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);
// 也可以通过[]对数组中的元素进行修改
array[0] = 100;
System.out.println(array[0]);
1. 数组是一段连续的内存空间,因此支持随机访问,即通过下标访问快速访问数组中任意位置的元素
2. 下标从0开始,介于[0, N)之间不包含N,N为元素个数,不能越界,否则会报出下标越界异常。
int[] array = {1, 2, 3};
System.out.println(array[3]); // 数组中只有3个元素,下标一次为:0 1 2,array[3]下标越界
// 执行结果
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 100
at Test.main(Test.java:4)
5.为什么数组的下标不从1开始
为什么不从下标1开始呢,数组其实存的是地址,下标是与数组的地址的偏移量,0偏移量也就是无偏移,是数组中第一个的内容。
6.遍历数组
从上面的代码中可以看到,如果要打印数组中的内容,一个一个sout输出,那就未免太麻烦的,所以我们用一种更加方便的方法:遍历数组。
int[]array = new int[]{10, 20, 30, 40, 50};
for(int i = 0; i < array.length; i++){
System.out.println(array[i]);
}
我们通过for循环把数组里面的内容每一个都循环一遍,这种方法方便又快速。
注意:在数组中可以通过 数组对象.length 来获取数组的长度,有几个元素就是几个元素。
三、数组在计算机中的原理
1.基本类型变量与引用类型变量的区别
基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。
public static void func() {
int a = 10;
int b = 20;
int[] arr = new int[]{1,2,3};
}
像上面的代码,a,b这种类型的变量,是直接把值存在内存中。但是arr这种数组的是引用类型,存的是arr的首地址。
从上图可以看到,引用变量并不直接存储对象本身,可以简单理解成存储的是对象在堆中空间的起始地址。通过该地址,引用变量便可以去操作对象。有点类似C语言中的指针,但是Java中引用要比指针的操作更简单。
2.认识 null
null 在 Java 中表示 "空引用" , 也就是一个不指向对象的引用.
int[] arr = null;
System.out.println(arr[0]);
// 执行结果
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:6)
你可以理解为:它为null,地址是0x00000000,但是这个地址不能用,所以不能操作。