数组

在第二天的教程中我们学习了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]);
    }
}

Comments

No comments yet. Why don’t you start the discussion?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注