在第二天的教程中我们学习了Java中的八大基本数据类型,字节类型、短整型、常规整型、长整型、单精度浮点类型、双精度浮点类型、字符类型以及布尔类型。接下来我们继续学习数组类型和字符串类型,因为这十种数据类型是我们前期学习Java编程经常会用到的。
早在编写我们自己的第一个程序HelloWorld的时候,其实就不知不觉使用到了数组和字符串。在编写main()方法的代码部分时,首先有这样一行代码
public static void main(String[] args)
这里的“String[]”用来标识变量args的类型是一个字符串数组。
数组这个概念是从单词“Array”直译过来的,表示一组数据,有集合和容器的意思。假设现在需要我们编写代码来表示3个用户的年龄,可能大家的第一反应是声明三个整数类型的变量,比如像下面这样,
int userAge1;
int userAge2;
int userAge3;
还好这里只有3个用户,如果是5个用户,10个用户,用这种方式编写代码就比较痛苦了,更好的做法是使用数组。
假设现在需要一个数组类型的变量来表示5个用户的年龄,可以这样编写代码,
int[] userAges = new int[5];
在上面这行代码中我们同时声明并初始化了一个数组类型的变量。变量名userAges前面的标识符“int[]”用来说明这个变量是数组类型,单词int标明这个数组的每一个子项或者成员都是常规整数类型。等号右边的代码“new int[5]”用来告诉电脑,这里需要在内存中为我们分配5个连续的存储空间来存储数组userAges。
像上面示例代码中的初始化做法常常叫做隐式初始化,因为我们并没有明确地指明数组的每个元素。我们在声明数组时也可以直接进行初始化,也叫做显式初始化,比如像这样,
int[] userAges = {22, 26, 20, 32, 28};
这里花括号“{}”中有五个数据,标明了我们的变量userAges可以用来存储一个包含五个成员或者元素的数组。
需要注意的是,一旦数组完成初始化了,不管是隐式初始化还是显式初始化,其大小就固定了。以这里为例,我们的数组userAges就只能存储五个元素。
数组完成初始化后就可以操作它的数据成员了。假设现在我们想要验证数组userAges的每个成员,可以这样编写代码,
System.out.println(userAges[0]);
System.out.println(userAges[1]);
System.out.println(userAges[2]);
System.out.println(userAges[3]);
System.out.println(userAges[4]);
这里我们使用方括号“[]”加索引标号的形式来访问数组的每个元素,需要注意的是在绝大多数编程语言里面索引标号都是从0开始的,即索引0表示第一个元素,索引1表示第二个元素,以此类推。
如果大家运行上面这段代码,我们的屏幕上会打印,
22
26
20
32
28
假设现在需要将数组userAges的第一个成员由22更新成29,我们可以这样编写代码,
userAges[0] = 29;
运行完上面这行代码后,数组userAges就变成了{29, 26, 20, 32, 28}。
接下来我们一起测试一些有意思的现象。假设现在需要另外一个int型数组用来表示用户积分,我们采用隐式初始化来编写代码,
int[] userPoints = new int[5];
System.out.println(userPoints[0]);
System.out.println(userPoints[1]);
System.out.println(userPoints[2]);
System.out.println(userPoints[3]);
System.out.println(userPoints[4]);
这段代码里面的所有做法都是合法的,因为我们在打印每个数组成员前就已经完成了数组的初始化,尽管这里采用的是隐式初始化。如果大家运行这段代码,屏幕上将会显式,
0
0
0
0
0
输出结果貌似说明了在进行数组的隐式初始化时,程序自动将每个数组成员的值设置成了0。那我们继续类似地创建一个其他类型的数组来看看。
byte[] userLevels = new byte[5];
System.out.println(userLevels[0]);
System.out.println(userLevels[1]);
System.out.println(userLevels[2]);
System.out.println(userLevels[3]);
System.out.println(userLevels[4]);
这里我们创建了一个大小也是5的数组userLevels,用来表示用户等级。因为用户等级可能不会超过127,所以这里缩小了类型范围,选择用字节类型byte。
如果大家运行这段代码,屏幕上会显式
0
0
0
0
0
我们继续看一个浮点数类型的例子。
double[] userRates = new double[5];
System.out.println(userRates[0]);
System.out.println(userRates[1]);
System.out.println(userRates[2]);
System.out.println(userRates[3]);
System.out.println(userRates[4]);
这里我们同样声明了一个大小为5的数组userRates用来表示用户开展某种活动的比率,比如购物卡月度使用率、多媒体内容点击率等等。如果运行这段代码,屏幕上将会显式
0.0
0.0
0.0
0.0
0.0
现在输出结果变成了小数0.0,不再是0了。
这些例子揭示了一个共性,那就是不管何种类型的数组,在进行隐式初始化时程序会自动赋予其默认值。对于整数类型,默认值为0;对于浮点数类型,默认值就是0.0;对于字符类型,默认值是Unicode码0;对于布尔类型,默认值就是false。大家可以自己尝试编写代码验证。
下面贴上本节教程的完整代码供大家学习参考。
public class ArrayDemo {
public static void main(String[] args) {
int userAge1;
int userAge2;
int userAge3;
// int[] userAges = new int[5];
int[] userAges = {22, 26, 20, 32, 28};
System.out.println(userAges[0]);
System.out.println(userAges[1]);
System.out.println(userAges[2]);
System.out.println(userAges[3]);
System.out.println(userAges[4]);
System.out.println("======================");
userAges[0] = 29;
System.out.println(userAges[0]);
System.out.println(userAges[1]);
System.out.println(userAges[2]);
System.out.println(userAges[3]);
System.out.println(userAges[4]);
System.out.println("======================");
int[] userPoints = new int[5];
System.out.println(userPoints[0]);
System.out.println(userPoints[1]);
System.out.println(userPoints[2]);
System.out.println(userPoints[3]);
System.out.println(userPoints[4]);
System.out.println("======================");
byte[] userLevels = new byte[5];
System.out.println(userLevels[0]);
System.out.println(userLevels[1]);
System.out.println(userLevels[2]);
System.out.println(userLevels[3]);
System.out.println(userLevels[4]);
System.out.println("======================");
double[] userRates = new double[5];
System.out.println(userRates[0]);
System.out.println(userRates[1]);
System.out.println(userRates[2]);
System.out.println(userRates[3]);
System.out.println(userRates[4]);
System.out.println("======================");
// 每个用户的幸运符号
char[] userMarks = new char[5];
System.out.println(userMarks[0]);
System.out.println(userMarks[1]);
System.out.println(userMarks[2]);
System.out.println(userMarks[3]);
System.out.println(userMarks[4]);
System.out.println("======================");
// 用户是否进行过登记
boolean[] userChecked = new boolean[5];
System.out.println(userChecked[0]);
System.out.println(userChecked[1]);
System.out.println(userChecked[2]);
System.out.println(userChecked[3]);
System.out.println(userChecked[4]);
}
}