1. 数组的基本概念
1.1 为什么要使用数组
假设现在要存5个学生的考试成绩,并对其进行输出,按照之前掌握的知识点,我么会写出如下代码:
public class TestStudent{ public static void main(String[] args){ int score1 = 70; int score2 = 80; int score3 = 85; int score4 = 60; int score5 = 90; System.out.println(score1); System.out.println(score2); System.out.println(score3); System.out.println(score4); System.out.println(score5); } }
上述代码没有任何问题,但不好的是:如果有20名同学成绩呢,需要创建20个变量吗?有100个学生的成绩那不得要创建100个变量。
仔细观察这些学生成绩发现:所有成绩的类型都是相同的,那Java中存在可以存储相同类型多个数据的类型吗?
1.2 什么是数组
数组:可以看成是相同类型元素的一个集合。在内存中是一段连续的空间。
比如现实中的车库:
在java中,包含6个整形类型元素的数组,就相当于上图中连在一起的6个车位,从上图中可以看到:
- 数组中存放的元素其类型相同
- 数组的空间是连在一起的
- 每个空间有自己的编号,其实位置的编号为0,即数组的下标
那在程序中如何创建数组呢?
1.3 数组的创建及初始化
1.3.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个字符串元素的数组
1.3.2 数组的初始化
数组的初始化主要分为动态初始化以及静态初始化。
1.动态初始化:在创建数组时,直接指定数组中元素的个数
int[] array = new int[10];
2.静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定
语法格式:
T[] 数组名称 = {data1, data2, data3, ..., datan};
例如:
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", "!!!"};
注:
- 静态初始化虽然没有指定数组的长度,编译器在编译时会根据 {} 中元素个数来确定数组的长度
- 静态初始化时,{} 中数据类型必须与 [] 前数据类型一致
- 静态初始化可以简写,省去后面的 new T[]
- 数组也可以按照如下C语言格式创建
- 但该种定义方式不太友好,容易造成数组的类型就是 int 的误解,[] 如果在类型之后,就表示数组类型,因此 int[] 结合在一块写意思更清晰
- 静态和动态初始化也可以分为两步,但是省略格式不可以
//比如下面的 array3 ,运行时就会产生编译失败 int[] array1; array1 = new int[10]; int[] array2; array2 = new int[]{10, 20, 30}; int[] array3; array3 = {1, 2, 3};//error
- 如果没有对数组进行初始化,数组中元素有其默认值
如果数组中存储元素类型为基类类型,默认值为基类类型对应的默认值,比如:
类型 | 默认值 |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0f |
double | 0.0 |
char | /u0000 |
boolean | false |
如果数组中存储元素类型为引用类型,默认值为 null。