上面程序的期望输出值是,
mapFrist的值均为1,
但是实际上输出结果为:
{key1=1}
{key2=2, key1=1}
这里是因为map发生了浅拷贝,mapFirst只是复制了map的引用,和map仍使用同一个内存区域,所以,在修改map的时候,mapFirst的值同样会发生变化。
浅复制:则是只复制对象的引用,两个引用仍然指向同一个对象,在内存中占用同一块内存。被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
如何解决?
使用深拷贝,拷贝整个对象,而非引用
Map中有个方法叫做putAll方法,可以实现深拷贝,如下
如上,输出结果为:
{key1=1}
{key1=1}
时间: 2024-11-01 17:07:56