java - Java 中的参数传递(ArrayList 与 Integer)

标签 java arraylist methods parameters

Java 是严格按值传递的。例如,如果我将一个整数传递给一个更改其值的方法并且不返回该值,则 main 方法中的整数将不会更改。

但是,当我将 ArrayList 传递给向列表添加项目的方法时,结果发现该方法更改了 main 方法中的 ArrayList。

public class test {
    public static void main(String[] args) {
        // create a array list
        ArrayList<String> item = new ArrayList<String>();
        addItems(item);
        System.out.println("Items in the main method are: ");
        for (int i = 0; i < item.size(); i++) {
            System.out.println(item.get(i));
        }
        System.out.println("\n***************************\n");
        int num = 0;
        plusOne(num);
        System.out.println("The value of num in the main method is: " + num);
    }

    //add two items to arrayList
    public static void addItems(ArrayList<String> item) {
        item.add("Item #1");
        item.add("Item #2");
        System.out.println("Items in the addItems method are: ");
        for (int i = 0; i < item.size(); i++) {
            System.out.println(item.get(i));
        }

    }

    //add one to num
    public static void plusOne(int num) {
        num = num +1;
        System.out.println("The value of num in the plusOne method is: " + num);

    }
}

这是输出:

Items in the addItems method are: 
Item #1
Item #2
Items in the main method are: 
Item #1
Item #2

***************************

The value of num in the plusOne method is: 1
The value of num in the main method is: 0

这很令人困惑。 为什么 addItems() 更改了 itemplusOne() 没有更改 num ? 有人可以解释一下吗?谢谢!

最佳答案

您需要区分按值传递和按引用传递。

当您将一个对象(例如您自己的自定义类的实例或 List 实例)作为参数传递给您的方法时,它们是通过引用传递的。基本上,您仍然有一个指向原始对象的指针,并且您正在直接编辑该对象。这就是您在列表中看到新项目的原因。

但是,在 Java 中,原始数据类型和不可变类(例如 String)是按值传递的。换句话说,您在 plusOne 方法内收到的 num 与您在方法外部收到的 num 不同。这就是为什么您不会看到方法范围之外的更改。

只需查看 String 的文档即可您会看到大量方法接受 String 并返回一个新的 String。他们不会直接修改输入字符串。

关于java - Java 中的参数传递(ArrayList 与 Integer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55821763/

相关文章:

java - 一次导入多个静态字符串

java - 如何判断数据库中的表是否存在?

c# - 具有 2 个参数和多个结果输出的 lambda 表达式

python - 作为实例方法调用时行为不同的类方法?

java - 在 Gradle 项目中使用 Kotlin 进行 Stripe 集成

java - Kafka connect 是否为 Cassandra 提供 java 驱动程序

Java ArrayList toArray避免复制

java - 如何将 ArrayList 传递给以集合作为输入的方法

java - 如何根据对象变量值的独特性将对象排序/分组到列表中?

objective-c - 顺序方法执行 obj-c