Java-将Lists传递给作为传递引用的方法

ale*_*ddy 10 java

stackoverflow中有很多关于按值传递和通过引用传递的讨论.但是我想知道以下场景中发生了什么?这个页面说java是按值传递的.Java是"通过引用传递"还是"传递价值"?.

如果是以下代码,则从removeElement方法中删除该元素,当我打印列表时,它将从列表中删除第5个元素.

public class Load {
    public static void main(String[] args) {


        ArrayList<Integer> list = new ArrayList<Integer>();
        list.addAll(Arrays.asList(1,1,2,3,5,5,13,21));
        removeElement(list);
        System.out.println(list);
    }
        public static void removeElement(List<Integer> list){
            list.remove(5);//removes element at index 5
        }
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出是 [1, 1, 2, 3, 5, 13, 21].

有人可以解释这是如何通过价值而不是通过参考传递?

Ell*_*sch 6

Java总是按值传递.任何类型变量的值Object实际上都是一个引用.这就是为什么,例如,==据说是一个参考比较,你需要.equals()用于比较Object.

  • 所以你是说 - 对于原始类型,它传递值。而对于引用类型,它不传递对象的值,而是传递对象的引用。但是它“按值”传递了这个引用。说 IMO 简单得多,对于原始类型,传递值,而对于引用类型,传递引用。我认为重力对这个问题的 [ObDuplicate](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value) 的评论是最好的 - 这取决于什么你的意思是“参考”。 (2认同)
  • @ElliottFrisch实际上,它不是_object_的值,它是_variable_的值.这很可能是造成这么多混乱的原因. (2认同)

Ani*_*kur 5

如果是原始类型,则纯粹pass by valueObjectspass by value of the reference

list从主方法传递到方法removeElement()作为参数时,将创建另一个指向相同List实例的(副本)引用。从这两个引用中进行的任何更改都将反映在同一实际实例上。但是,如果您将一个引用分配给某个新对象,则另一个引用仍将指向相同的原始实例。


See*_*ose 4

尽管这个问题(再次)询问“按值传递”和“按差异传递”之间的区别,但我认为存在潜在的误解,导致如此多的混乱。必须解决这个问题:

\n\n

事实上,方法调用按值传递所有参数。正如 Erwin Bolwidt 在他的评论中指出的,有两种类型:

\n\n
    \n
  • 原始类型
  • \n
  • 参考类型
  • \n
\n\n

JLS (\xc2\xa74)指出:

\n\n
\n

Java 编程语言是一种静态类型语言,这意味着每个变量和每个表达式都有一个在编译时已知的类型。
\n [...]
\n Java 编程语言中有两种类型:原始类型 ( \xc2\xa74.2 ) 和引用类型 ( \xc2\xa74.3 )。

\n
\n\n

当谈到“按值传递”时,意味着变量的内容在用作方法调用的参数时按值传递。引用类型变量的内容是引用。它不是变量引用的对象。这是一个巨大的差异。

\n\n

在您的示例中,变量的内容list作为值传递给方法removeElement。该是对列表对象的引用。

\n\n

这进一步意味着该方法removeElement现在可以访问该列表对象(通过其引用)并可以对其进行操作,例如删除元素。但它无法访问调用该方法的变量的内容。list因此它不能更改方法内变量的内容main(这可以通过“按引用传递”实现)。

\n