Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于ArrayList机制的问题_Java - Fatal编程技术网

Java 关于ArrayList机制的问题

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

基本上,当我在Java中传递参数时,我知道它只传递值

但是,下面的代码显示在
子类
子方法
上执行的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是正确的。