Java 关于ArrayList机制的问题
基本上,当我在Java中传递参数时,我知道它只传递值 但是,下面的代码显示在Java 关于ArrayList机制的问题,java,Java,基本上,当我在Java中传递参数时,我知道它只传递值 但是,下面的代码显示在子类的子方法上执行的add方法会影响MainClass的ArrayList MainClass.java public class MainClass{ public satatic void main(String[] args){ List list = new ArrayList<>(); SubClass subClass = new SubClass(list
子类的子方法上执行的add方法会影响MainClass
的ArrayList
MainClass.java
public class MainClass{
public satatic void main(String[] args){
List list = new ArrayList<>();
SubClass subClass = new SubClass(list);
subClass.subMethod();
System.out.println(list) // Why added value???
}
}
public class SubClass{
private List list;
public SubClass(List list){
this.list = list;
}
public void subMethod(){
list.add(1);
list.add(2);
}
}
public class MainClass{
public satatic void main(String[] args){
Map map = new HashMap<>();
SubClass subClass = new SubClass(map );
subClass.subMethod();
System.out.println(map) // Not putting value
}
}
public class SubClass{
private Map map;
public SubClass(Map map){
this.map= map;
}
public void subMethod(){
map = someGenerationHashMap(arg1, arg2);
}
}
当我对HashMap
的put
做同样的事情时,对main类的HashMap
没有任何影响
我想知道为什么只有ArrayList
会导致这些结果,以及Java内部发生了什么
更新
hashmap版本的代码如下所示:
MainClass.java
public class MainClass{
public satatic void main(String[] args){
List list = new ArrayList<>();
SubClass subClass = new SubClass(list);
subClass.subMethod();
System.out.println(list) // Why added value???
}
}
public class SubClass{
private List list;
public SubClass(List list){
this.list = list;
}
public void subMethod(){
list.add(1);
list.add(2);
}
}
public class MainClass{
public satatic void main(String[] args){
Map map = new HashMap<>();
SubClass subClass = new SubClass(map );
subClass.subMethod();
System.out.println(map) // Not putting value
}
}
public class SubClass{
private Map map;
public SubClass(Map map){
this.map= map;
}
public void subMethod(){
map = someGenerationHashMap(arg1, arg2);
}
}
这与ArrayList无关。可以修改作为参数传递的任何对象。通过值传递的是对象的地址,而不是对象本身
在地图版本中,您没有进行任何可能修改它的操作。在列表版本中,您正在进行添加
确保不要将对象与基本体混淆。例如,请确保不要将int
与Integer
混淆,这与ArrayList无关。可以修改作为参数传递的任何对象。通过值传递的是对象的地址,而不是对象本身
在地图版本中,您没有进行任何可能修改它的操作。在列表版本中,您正在进行添加
确保不要将对象与基本体混淆。例如,请确保不要将int
与Integer
混淆。您可以共享HashMap
版本的代码吗?因为它们的行为应该是相同的。Java的可能副本通过引用传递对象。这意味着您的子类
和main类
共享同一个列表。当输入int、long、boolean等基数值时,情况就不同了(注意小写)。具有HashMap
的版本-它还将影响HashMap
。你能和HashMap分享一下代码吗?肯定有些不同。更新我的code.System.out.println(map)只是简单的代码。问题是在这种情况下HashMap.isEmpty是正确的。您可以共享HashMap
版本的代码吗?因为它们的行为应该是相同的。Java的可能副本通过引用传递对象。这意味着您的子类
和main类
共享同一个列表。当输入int、long、boolean等基数值时,情况就不同了(注意小写)。具有HashMap
的版本-它还将影响HashMap
。你能和HashMap分享一下代码吗?肯定有些不同。更新我的code.System.out.println(map)只是简单的代码。问题是在这种情况下HashMap.isEmpty是正确的。