java - Java 是按值传递还是按引用传递还是两者兼而有之?

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

考虑以下情况。

    List<Integer> listOne = new ArrayList<>();
    List<Integer> listTwo = new ArrayList<>();
    listOne.add(1);I think this happens due to 
    listOne.add(2);
    listOne.add(3);
    Collections.reverse(listOne);
    listTwo = listOne;  //listTwo has same reference 
    Collections.reverse(listOne);
    System.out.println(listOne);  //out put [1, 2, 3] 
    System.out.println(listTwo);  // same out put

Java is pass by value, where values (for non primitive types) happen to be references.我认为这为java在这种情况下提供了生存空间。说实话为什么java尽量避免pass by reference并尝试与 some of other languages 不同?而java仍然遭受引用传递行为的困扰?

编辑:另外请有人解释一下上面代码中发生了什么

最佳答案

Java 不会遭受引用传递行为的困扰,它很喜欢它们:)

当你写作时

List listOne = new ArrayList<>();

您需要考虑件事:

1) 一个变量,它是一 block 内存,名为listOne

2)堆上的一个对象,是ArrayList的一个实例,是一 block 更大的内存,并且没有名字

3)listOne变量的值,它不是一个内存块,而是放置在变量listOne内存中的一组0和1,并且该值也没有名称。

现在,当我们谈论 listOne 是按值传递还是按引用传递时,我们使用不精确的术语,这会导致误解。 listOne(事物 1)根本没有通过值或引用传递。 listOne(事物 3)的值被传递,这可以访问 ArrayList 对象(事物 2)。因此,如果我们使用名称“listOne”但表示事物 3,则它是按值传递的,如果我们表示事物 2,则它是按引用传递的。在这两种情况下,名称“listOne”都不是事物 2 或事物 3 的正确名称,但使用它是因为它简短且方便。

关于java - Java 是按值传递还是按引用传递还是两者兼而有之?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18249555/

相关文章:

java - 从 oracle db 执行 java callout

Java - 包括 BST

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

c++ - 将临时对象作为参数传递 (C++)

c - 如何修改已传递给 C 函数的指针?

java - Spring MVC 国际化 : Content not changing as per the selected language

java - 如何针对 Feed pull 优化 Tomcat

C++ 通过引用返回本地对象

java - 如何不通过引用将元素从 ArrayList 复制到另一个?

javascript - 按值将参数传递给 onClick 函数