java - 当它是一个像更改数组值这样的参数时,如何更改 Integer 值?

标签 java integer pass-by-reference pass-by-value

<分区>

public static void main(String[] args) {
    Integer i = new Integer(0);
    int[] arr = {1};
    p1(i);
    p2(arr);
    System.out.println(i);
    System.out.println(arr[0]);
}


public static void p1(Integer i) {
    i = 2;
}

public static void p2(int[] i) {
    i[0] = 2;
}

//输出:0, 2

如何像改变arr的值一样改变i的值?

最佳答案

您不能从 p1 方法中更改 main 中变量 i 的值,因为参数是按值传递的: p1 中的参数i 完全独立于i 变量,只是它们在方法开始时具有相同的值。 Java 总是 使用按值传递语义 - 但当参数类型是类时,它是按值传递的引用

事实上,您也没有更改 arr 的值 - 它是对与以前相同的数组的引用,但是数组的值已经变了。而这正是 Integer 无法做到的,因为 Integer 是一种不可变类型。

如果你想要一个像Integer这样的可变类,你可以使用AtomicInteger相反:

public static void main(String[] args) {
    AtomicInteger i = new AtomicInteger(0);
    modify(i);
    System.out.println(i);
}

private static void modify(AtomicInteger x) {
    x.set(2);
}

我通常不会这样做,但是 - 我通常尽量不修改方法参数引用的对象。相反,我编写了计算单个结果并返回该结果的方法。

关于java - 当它是一个像更改数组值这样的参数时,如何更改 Integer 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26185527/

相关文章:

java - 将 3DES 存储在字符串中而不是 CipherOutputStream

java - 局部变量还没有初始化?

java - 如何使用 Java 中的 BufferedReader 从文件中读取整数?

c++ - 如何通过引用传递 vector 的静态 vector ?

java - 如何从加密字符串中获取原始字符串值?

java - 如何从java中的方法返回List<Long>值并将其放入新列表中?

cocoa - 如何将整数传递给模型类

c - 如果 "long"和 "int"在平台上的大小相同 - "long"和 "int"有什么不同吗?

javascript - 通过引用从一个数组推送到另一个数组

c++ - 为什么我的插入排序函数不会更改我从 int main 传递的数组?