Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我能够在一个超出范围的方法中修改列表而不返回它?_Java - Fatal编程技术网

Java 为什么我能够在一个超出范围的方法中修改列表而不返回它?

Java 为什么我能够在一个超出范围的方法中修改列表而不返回它?,java,Java,比如说,我初始化了我的列表,如下所示: public static void main(String[] args) { ArrayList<String> a = new ArrayList<String>(); a.add("one"); a.add("two"); a.add("three"); a.add("four"); modifyList(a); } private static void modifyLis

比如说,我初始化了我的列表,如下所示:

public static void main(String[] args) {
    ArrayList<String> a = new ArrayList<String>();
    a.add("one");
    a.add("two");
    a.add("three");
    a.add("four");
    modifyList(a);
}
private static void modifyList(ArrayList<String> a) {
    for (int i = 0; i < a.size(); i++) {
        a.set(i, "one");
    }
}
如果在调用此方法之前和之后打印列表,我希望相同的原始列表出现两次。但由于某些原因,modifyList中修改的ArrayList与main中的ArrayList相同

如果我尝试使用int和string而不是list进行相同的实验,它们不会被修改


有人能解释为什么吗

在Java中,参数是按值传递的

但是,您将对ArrayList的引用传递给了该方法,并且引用本身是按值传递的,因此该方法修改了原始列表


如果要确保这不会发生,则需要传递一个不可变列表作为参数。

在Java中,参数是按值传递的

但是,您将对ArrayList的引用传递给了该方法,并且引用本身是按值传递的,因此该方法修改了原始列表


如果要确保这不会发生,则需要传递一个不可变列表作为参数。

如果是这样,那么,当我使用int和strings时,我不是将Integer/String对象的引用传递给一个方法而不是它的值吗?就像我传递ArrayList的引用而不是它的值一样?你应该显示实验的代码,这些实验的行为不符合你的预期。整数和整数之间有区别,信不信由你,实际上是整数和整数,我们无法从你的描述中确定你做了什么。Java原语int、float、byte、char等与Java对象之间有区别,但字符串除外,它是一个被视为原语的对象。原语是按值传递的,是不可变的。因此,当您尝试更改基本体时,将创建一个新值,而不是更改原始值。但是,对象是通过引用原始对象传递的,因此对其所做的任何更改都会影响原始值。@eyesenberg如果传递整数,则通过值传递对该整数对象的引用。如果传递int,则传递值。这是两种不同的情况。请注意,字符串、整数和其他类似原语的类都是不可变的。啊,好的,这会清除所有内容。感谢大家。如果是这样的话,那么当我使用int和String时,我传递Integer/String对象的引用到一个方法而不是它的值,就像传递ArrayList的引用而不是它的值一样吗?你应该展示一些实验的代码,它们的行为与你期望的不一样。整数和整数之间有区别,信不信由你,实际上是整数和整数,我们无法从你的描述中确定你做了什么。Java原语int、float、byte、char等与Java对象之间有区别,但字符串除外,它是一个被视为原语的对象。原语是按值传递的,是不可变的。因此,当您尝试更改基本体时,将创建一个新值,而不是更改原始值。但是,对象是通过引用原始对象传递的,因此对其所做的任何更改都会影响原始值。@eyesenberg如果传递整数,则通过值传递对该整数对象的引用。如果传递int,则传递值。这是两种不同的情况。请注意,字符串、整数和其他类似原语的类都是不可变的。啊,好的,这会清除所有内容。谢谢大家。