Yesterday I found that I cannot clone the HashMap rightly through the clone() of HashMap. After cloning, The origin HashMap Object also can be modified by clone HashMap. That's a serious problem in the system.
I take a investigation on it and find the answer.The following is the solution.
Cause: the HashMap's clone is a shallow clone.If you want to get a deep one, must overrite the clone method by yourself.
The following codes is my example.Remember that should take the generic type to code it.
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
/**
* @author ppju
* @param <K,V>
*
*/
public class CloneHashMap<K,V> extends HashMap<K, V>{
private static final long serialVersionUID = -6550003591342797010L;
public Object clone(){
HashMap<K,V> cloneMap = new HashMap<K,V>();
Iterator<Entry<K, V>> it = this.entrySet().iterator();
while(it.hasNext()){
Map.Entry<K, V> entry = it.next();
K key = entry.getKey();
V value = entry.getValue();
cloneMap.put(key, value);
}
return cloneMap;
}
public static void main(String[] args){
CloneHashMap<String, String> test = new CloneHashMap<String, String>();
test.put("1", "-----");
test.put("2", "-----");
Map<String, String> clone = (Map<String, String>)test.clone();
clone.put("1", "sjflajsl");
System.out.println(test.toString());
System.out.println(clone.toString());
System.out.println(test.toString());
}
}
Welcome to propose your comments. Thank you.
分享到:
相关推荐
包括equals()、hashCode()、toString()、clone()、finalize()等,它们是所有类的基类Object提供的。 7. **Java的四种引用**: 强引用、软引用、弱引用、虚引用,分别对应不同的垃圾回收策略,适用于内存管理的...
13. **Object类有哪些方法:** Object是Java所有类的根类,包含wait()、notify()、notifyAll()、clone()、getClass()、hashCode()、toString()等基本方法。 14. **Java是属于静态语言还是动态语言:** Java是一种...
hashCode()主要用于哈希表,如HashMap,相同对象的hashCode应相同以保证哈希表的正确工作。然而,不同对象可以有相同的hashCode,这不会违反哈希表的规则。 String类在Java中是final的,不能被继承。这是因为String...
- OverLoad与Override的区别:OverLoad是方法的重载,即在同一个类中可以存在多个同名方法,只要它们的参数列表不同;Override是方法的重写,子类重写父类的方法。 除此之外,本指南还涉及到了Collection与...
- OverLoad与Override的区别:明确方法重载(Overload)和方法覆盖(Override)之间的区别。 - Collection与Collections的区别:知道Collection是集合框架的根接口,而Collections是一个工具类。 第三部分:Java...
9. `Overload`和`Override`的区别:`Overload`是重载,发生在同一类中,方法名相同但参数列表不同;`Override`是重写,发生在子类中,方法名、参数列表和返回类型必须与父类一致。 10. `final`类的特点:`final`类...
10. **OverLoad与Override的区别**:Overload是方法重载,Override是方法重写。 11. **Collection与Collections的区别**:Collection是集合类的根接口,Collections是包含集合操作工具方法的类。 12. **Class.for...
- 在`clone()`方法中,通常会有`super.clone()`调用,以确保正确克隆对象。 **49. 在JAVA中,如何跳出当前的多重嵌套循环?** - 可以使用标签化的`break`语句来跳出多重嵌套循环。 **50. List、Map、Set三个接口,...
50. HashMap和Hashtable都是Map接口的实现类,但Hashtable是线程同步的,而HashMap不是,并且HashMap允许有null键和null值,Hashtable不允许。 以上是Java基础面试题中涉及的一些主要知识点,对于初学者和即将面试...
实现 `clone()` 方法时通常会调用 `super.clone()` 来完成克隆过程。需要注意的是,调用 `super.clone()` 前应该确保当前对象是可克隆的,并且需要处理可能抛出的 `CloneNotSupportedException` 异常。 ### 3. 封装...
- **重载(Overload)**:同一个类中方法名相同但参数不同的方法。 - **覆盖(Override)**:子类重写父类的方法,方法名、参数列表和返回类型都必须相同。 - **4.11 Collection与Collections的区别:** - `...
12. **HashMap的差异**:在JDK1.7中,HashMap基于数组+链表实现,JDK1.8引入了红黑树,当链表长度超过8时,会转换为红黑树,提高了查找效率。 13. **ConcurrentHashMap**:ConcurrentHashMap是线程安全的哈希映射,...
// If current element is smaller than the pivot if (arr[j] ) { i++; // swap arr[i] and arr[j] int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } // swap arr[i+1] and arr[high] (or ...
- `clone()`:创建并返回该对象的一个副本。 - `notify()` 和 `notifyAll()`:唤醒正在等待此对象监视器的线程。 - `wait()`:导致当前线程等待这个对象的监视器。 - `finalize()`:垃圾回收前调用,可以用来...
- `clone()`:保护类型,创建并返回对象的一个副本。实现 Cloneable 接口才能避免 CloneNotSupportedException。 - `equals()`:比较对象是否相等,通常用于判断两个对象的内容是否一致。 - `finalize()`:保护...
HashMap和Hashtable都实现了Map接口,HashMap非线程安全,可以接受null键和多个null值;Hashtable线程安全,不允许null键和值。 46. Collection和Collections的区别。 Collection是一个集合框架的主要接口,包括...
- **重载(Overload)**:在同一个类中定义多个同名的方法,但参数列表不同。 - **重写(Override)**:在子类中定义一个与父类同名的方法,参数列表完全相同,以覆盖父类的方法。 - **返回值类型**:重载的方法可以有...
- **举例**: `Integer`可以用作`HashMap`的键。 **1.15 `Math.round()`函数的行为** - **知识点**: `Math.round(11.5)`结果为`12`,`Math.round(-11.5)`结果为`-11`。 - **解释**: `Math.round()`方法对小数点后第...