HashMap和Hashtable的区别
都实现了Map接口,差别在于速度、线程安全和同步性
1、HashMap是非synchronized的,可以接受为null的键值(key)和值(value); HashTable 是synchronized的,不能接收null
2、HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable,如果没有正确的同步的话,多个线程不能共享HashMap。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
3、另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为
4、HashMap不能保证随着时间的推移Map中的元素次序是不变的。
让HashMap同步的方法
- Collections.synchronizeMap(hashMap);
- 使用ConcurrentHashMap
HashMap和HashSet的区别
1.HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。public boolean add(Object o)方法用来在Set中添加元素,当元素值重复时则会立即返回false,如果成功添加的话会返回true
网友评论