拷贝

深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。
大致示意图如下:
image.png

浅拷贝

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。

深拷贝

深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

HashMap拷贝方式

Map<k,v> copyMap = new HashMap<k,v>();

方式一

Map<k,v> valueMap = copyMap;

方式二

Map<k,v> valueMap = new HashMap(copyMap);

方式三

Map<k,v> valueMap = copyMap.clone();

方式四

遍历拷贝值
Map<k,v> valueMap = new HashMap();

Iterator<Map.Entry<k, v>> entries = copyMap .entrySet().iterator();
while (entries.hasNext()) {
    Map.Entry<K, V> entry = entries.next();
    K key = entry.getKey();
    V value = entry.getValue();
    valueMap.put(key , value );
}

方式五


 <dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>2.6</version>
 </dependency>


Map<K, V> propertiesMap = (HashMap<K, V>) SerializationUtils.clone(copyMap);

HashMap拷贝方式的不同

方式一、二、三都算是浅拷贝,即新、旧Map,其中一个Map改动值,另一个Map的值也会随着改变,这个值是指对象,String类型不在此考虑

方式四,若是k和v就直接=,就是浅拷贝,若是赋值到新的v对象,则深拷贝

方式五需要对象及对象类中的属性对象都要实现Serializable,否则会报异常。