Java HashMap不修改对象内容

Java HashMap不修改对象内容,java,pass-by-value,Java,Pass By Value,我有一个hashmap,其中我放置了一个对象的引用 DateTest test100 = new DateTest("ABC",100); dateTestMap.put(96, test100); 我将此引用变量传递给一个方法,在该方法中我将为其分配一个不同的对象,返回后,我将现有引用指向新对象,如下所示: test100 = datePassingTest(test100); private DateTest datePassingTest(Date

我有一个hashmap,其中我放置了一个对象的引用

     DateTest test100 = new DateTest("ABC",100); 
     dateTestMap.put(96, test100);
我将此引用变量传递给一个方法,在该方法中我将为其分配一个不同的对象,返回后,我将现有引用指向新对象,如下所示:

    test100 = datePassingTest(test100);

    private DateTest datePassingTest(DateTest test100)
    {
        DateTest newTest = new DateTest("XYZ", 69);
        test100 = newTest;
        return test100;
    }
test100确实被修改为指向新对象,但是map中存储的值没有得到更新。我有什么遗漏吗

谢谢,
Adithya

这是因为
test100
没有保存使用此
新日期测试(“ABC”,100)创建的对象的引用。现在它指向由这个
newdatetest(“XYZ”,69)创建的对象

如果您执行了类似于
test100.setSomething(150)
的操作,那么更改将反映在地图中。在这种情况下,它将不会出现,因为
test100
现在引用的是一个完全不同的对象

DateTest test100 = new DateTest("ABC",100); 
dateTestMap.put(96, test100);
这里有一个引用副本(属于
test100
)进入
dateTestMap
,它指向
DateTest(“ABC”,100)
。现在一个HashMap
dateTestMap
包含一个新引用,它指向相同的对象
DateTest(“ABC”,100)

所以可以这样描述

现在当你这么做的时候

test100 = datePassingTest(test100);
test100 = newTest
外部
test100
将指向
新的日期测试(“XYZ”,69)
,但是
日期测试图
中的复制参考仍然指向相同的
日期测试(“ABC”,100)
对象

Java是按值传递的
——这本质上意味着当您这样做时传递引用的副本

test100 = datePassingTest(test100);
test100 = newTest
唯一要做的是test100现在引用与newTest相同的对象。test100的原始值引用的对象仍然存在,但仅存在于hashmap中

要想做你想做的事,你应该试试

test100.setTime(newTest.getTime());

这是因为,您将对象放在地图中,然后修改对象。因此,贴图仍将保留旧对象

 DateTest test100 = new DateTest("ABC",100); 
 dateTestMap.put(96, test100);           // entry/object added to map

 test100 = datePassingTest(test100);     // object updated

 dateTestMap.put(96, test100);           // map gets new object

// now the map contains the updated object but not the older one.

您没有修改
对象
。您只是
分配

解释清楚,

如果两个变量包含对同一对象的引用,则可以使用一个变量对该对象的引用来修改该对象的状态,然后可以通过另一个变量中的引用来观察修改后的状态


地图中的外部test100和test100引用是相同的,因此,如果外部test100指向一个新对象,理想情况下,地图引用应该指向同一个新对象,除非地图复制了另一个引用并存储了引用!当我说引用被复制时,我很清楚内部和外部
test100
是不一样的。你是说地图中的test100引用和test100引用是两个不同的副本,即这两个副本是否指向test100对象?在方法返回后,只有引用test100(不是map引用)指向新对象?这是否意味着java在映射中存储值时复制了引用test100?它只存储引用。不是对象的副本或其他东西。看一看。它清楚地解释了一切。