[Day12] CH08:积沙成塔——Array & ArrayList(中)

还记得我们前两天学的方法吗?结合昨天学的阵列,阵列也可以用在方法里传递吗?

当然可以罗!我们就先来看个例子:

public class PassArray {
    public static void main(String[] args){
        int[] arr = {1, 2, 3, 4, 5};
        System.out.print("Original array:");
        for(int number : arr){
            System.out.printf(" %d", number);
        }
        System.out.println();
        
        doubleArray(arr);
        System.out.print("After double array:");
        for(int number : arr){
            System.out.printf(" %d", number);
        }
        System.out.println();
        
        System.out.printf("Original 3rd element: %d%n", arr[2]);
        doubleElement(arr[2]);
        System.out.printf("After double 3rd element: %d%n", arr[2]);
    }

    public static void doubleArray(int[] array){
        for(int i = 0 ; i < array.length ; i++){
            array[i] *= 2;
        }
    }

    public static void doubleElement(int element){
        element *= 2;
    }
}
Original array: 1 2 3 4 5
After double array: 2 4 6 8 10
Original 3rd element: 6
After double 3rd element: 6

我们可以看到,在 doubleArray() 这个方法中,参数列是一个整数阵列,main 程序中的阵列经过这个方法後,印出来的阵列变成 2 倍。此时阵列变成 2、4、6、8、10,因此可以得知,我们在 doubleArray() 修改阵列值,在 main 程序的值也被更新了。

你觉得很合理吗?那麽接着我们往下看,我们再将阵列元素第三个也就是索引值为 2 的元素 double,前後印出的结果竟然都是 6,double 完应该要是 12 不是吗?

在许多程序语言中,方法在传递引数有分为传值呼叫(pass-by-value/call-by-value)和传址呼叫(pass-by-reference/call-by-reference)。传值呼叫就像是 doubleElement() 所表现的,在 main 中我传递 arr[2] 的「值」,也就是 6 给 doubleElement() 里的 element,此时 element 是 arr[2] 的副本,他们具有同样的值,但不是同一个东西,所以 element 乘 2 时会变成 12,但是 arr[2] 中的元素并不会被更改到值。

Java 所有的引数都是传值呼叫。虽然在 doubleArray() 中看起来和前面的不一样,好像应该是传址呼叫,但这是 Java 与其他程序语言不同的地方。阵列是一个物件(详细的物件介绍之後会说明),为了增进效能(不然每一个阵列元素都必须建立一个副本),main 中的 arr 和 doubleArray() 中的 array 会指向同一块记忆体。因此在修改 doubleArray() 中的 array 元素时,main 中的 arr 也会因为参考到同一块记忆体,而取得同样的值,最後再次强调 Java 所有的引数都是传值呼叫。

为了让大家可以消化,最後在讲一个平易近人的「多维阵列」就好

目前为止介绍的都是一维阵列,也就是一般常见的排队排成一列,但看电影可以有音效和丰富的剧情,甚至可以是 3D 的,阵列当然也可以 XD。

二维阵列

int[][] arr = new int[2][3];	//2 个 row,每个 row 3 个 elements

当然也可以直接给值,且不同长度:

int[][] arr = {{1, 2} , {3, 4, 5}}

今天的东西有点玄,但还是希望大家能吸收,所以就把剩下的东西留到明天了,继续加油吧!


<<:  Day 12「可恶想要」单元测试、Code Smell 与重构 - Feature Envy 篇

>>:  Day12,YAML Engineer 初登板

前端工程学习日记第10天

<!DOCTYPE html> <html lang="en"...

Day05_CAP定理

今天讲解的是 CAP 定理 DAY05_CAP定理 ...

第31天~

这个的前一篇是~https://ithelp.ithome.com.tw/articles/1024...

数位变革

在疫情爆发之前,一切的一切看似都非常的正常,但是在爆发之後,所有的一切都被疫情给打乱了,并且所有的秩...

[Day6] THM Basic Pentesting

今天开始来打一题 Try Hack Me 的题目吧!这一题可以学习到几种常见的暴力破解相关技术。 题...