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,则传递值。这是两种不同的情况。请注意,字符串、整数和其他类似原语的类都是不可变的。啊,好的,这会清除所有内容。谢谢大家。