考虑以下情况。
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/