JavaTutorial

[TOC]

6.数组

在Java中,数组有两种声明方式:

int a[];
int[] a;

java程序员一般习惯用第二种。

赋值方式基本与C语言一致,下面来看一个小例子:

public class FirstSample {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5};
        char[] chars = {'a', 'b', 'c', 'd', 'e'};
        for (int i = 0; i < nums.length; i++) {
            System.out.println(nums[i]);
        }
        for (int i = 0; i < chars.length; i++) {
            System.out.println(chars[i]);
        }
     }
}

6.2 数组拷贝

数组拷贝可以分为两种,借用C++的说法

废话不多说,先看浅拷贝:

6.2.1 浅拷贝

直接利用等号进行拷贝

public class FirstSample {
    public static void main(String[] args) {
        int[] nums1 = {1, 2, 3, 4, 5};
        int[] nums2 = nums1;
        nums2[4] = 21;
        for (int e : nums1) {
            System.out.println(e);
        }
        System.out.println("----------");
        for(int e : nums2) {
            System.out.println(e);
        }
     }
}

可以知道,浅拷贝生成的数组,与原数组指向同样的数组,其中一个改变也会带动另外一个改变

graph LR; nums1 --> 1,2,3,4,5; nums2 --> 1,2,3,4,5;

6.2.2 深拷贝

利用Array类的copyOf方法,代码如下:

import java.util.Arrays;

public class FirstSample {
    public static void main(String[] args) {
        int[] nums1 = {1, 2, 3, 4, 5};
        int[] nums2 = Arrays.copyOf(nums1, nums1.length);
        nums2[4] = 21;
        for (int e : nums1) {
            System.out.println(e);
        }
        System.out.println("----------");
        for(int e : nums2) {
            System.out.println(e);
        }
     }
}

深拷贝创建了全新的数组,如下图所示:

graph LR; nums1 --> 1,2,3,4,5; nums2 --> new_1,2,3,4,5;

6.3 命令行参数

每一个Java应用程序,都有一个带String args[]参数的main方法。这个参数表明main方法将接受一个字符串数组,我们称之为命令行参数

数组操作

导入类java.util.Arrays的静态方法,来对数组进行操作:

static String toString(type[] a) 返回a中数据元素的字符串,这些数据元素被放在括号内,并用逗号分割

参数:a 类型为int, long, short, char, byte, boolean, float或double的数目

返回与a类型相同的数组,其长度为length或者end-start,数组元素为a的值。

参数:a 类型为int, long, short, char, byte, boolean, float或double的数目

start 起始下标(包含这个值)

end 终止下标(不包含这个值),如果end大于a.length,在这种情况下,结果为0或false

length 拷贝的数据元素长度。如果length只大于a.length,结果为0或者false

参数:a类型为int, long, short, char, byte, boolean, float或double的数目

采用二分搜索算法查找值 v,如果成功,则返回相应的下标值;否则,返回一个负数值。

参数:a

start 起始下标

end 终止下标

v 同a的数据元素类型相同的值

将数组的所有元素值设为v

static boolean equals(type[] a, type[] b)

如果两个数组大小相等,数组内对应元素相等,返回true

参数:from 任意类型的数组

fromIndex 原始数组中待拷贝元素的起始下标

to 与from同类型的数组

toIndex 目标数组放置拷贝元素的起始下标

count 拷贝的元素数量

多维数组

double[][] balances;

int[][] nums = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12},
    {13, 14, 15, 16}
}; 

for-each循环不能处理二维数组的每一个元素,它是按照行,也就是一维数组来处理的。

for(double[] row : a) {
    for(double value : row) {
        do something with value
    }
}

java的多维数组可以看作是多个一维数组的集合。

下面这个例子,创建了一个三角形的多维数组

public class FirstSample {
    public static void main(String[] args) {
        int[][] odds = new int[10][];
        for(int n = 0; n < 10; n++) {
            odds[n] = new int[n+1];
        }
        for(int[] row : odds) {
            for(int value : row) {
                System.out.print(value);
            }
            System.out.println();
        }
    }
}