HashMap、HashTable、LinkedHashMap、TreeMap使用和区别

1.HashMap继承AbstractMap 实现Map接口,Map在java.util包中是独立的接口,不是继承Collection接口,继承Collection接口的有:

/** * @see     Set * @see     List * @see     Map * @see     SortedSet * @see     SortedMap * @see     HashSet * @see     TreeSet * @see     ArrayList * @see     LinkedList * @see     Vector * @see     Collections * @see     Arrays * @see     AbstractCollection * @since 1.2 */

public interface Collection<E> extends Iterable<E> {...}

实现Map接口的类有:
 * @see HashMap * @see TreeMap * @see Hashtable * @see SortedMap * @see Collection * @see Set * @since 1.2 */public interface Map<K,V> {...}

HashMap的申明方法是:
public class HashMap<K,V> extends AbstractMap<K,V>    implements Map<K,V>, Cloneable, Serializable {...}
HashMap是Map接口中最常用的实现类,存储Key-Vlaue键值对,HashMap不保证元素的顺序但是保证Key是唯一的

1.1 添加元素,提供了三种方法添加元素:
//单个添加元素,重复key值会覆盖public V put(K key, V value) {    return putVal(hash(key), key, value, false, true);}//批量添加

public void putAll(Map<? extends K, ? extends V> m) {
    putMapEntries(m, true);}
//单个添加,如果key存在不希望value值被覆盖public V putIfAbsent(K key, V value) {    return putVal(hash(key), key, value, true, true);}

1.2 删除元素:有两个方法的重载:
public boolean remove(Object key, Object value) {    return removeNode(hash(key), key, value, true, true) != null;}
public V remove(Object key) {    Node<K,V> e;    return (e = removeNode(hash(key), key, null, false, true)) == null ?        null : e.value;}1.3 修改元素两个方法的重载:
@Overridepublic boolean replace(K key, V oldValue, V newValue) {    Node<K,V> e; V v;    if ((e = getNode(hash(key), key)) != null &&        ((v = e.value) == oldValue || (v != null && v.equals(oldValue)))) {        e.value = newValue;        afterNodeAccess(e);        return true;    }    return false;}

@Overridepublic V replace(K key, V value) {    Node<K,V> e;    if ((e = getNode(hash(key), key)) != null) {        V oldValue = e.value;        e.value = value;        afterNodeAccess(e);        return oldValue;    }    return null;}

1.4 判断集合是否为空:
public boolean isEmpty() {    return size == 0;}

1.5 判断集合元素大小:
public int size() {    return size;}

1.6 遍历元素a,使用keySet获取所有的key,然后遍历b,使用Map.entrySet获取所有的元素,然后使用iterator遍历,返回的是一个set集合,Set<Map.Entry<K,V>>c,使用Map.entrySet获取所有的元素,然后使用foreach循环遍历d,直接使用values获取所有的值,然后遍历,这种方式获取不到key

1.7 清空集合
/** * Removes all of the mappings from this map. * The map will be empty after this call returns. */public void clear() {    Node<K,V>[] tab;    modCount++;    if ((tab = table) != null && size > 0) {        size = 0;        for (int i = 0; i < tab.length; ++i)            tab[i] = null;    }}

2.HashTable也是Map的实现类,它的方法是同步的,所以是线程安全的
HashTable的申明方法:
public class Hashtable<K,V>    extends Dictionary<K,V>    implements Map<K,V>, Cloneable, java.io.Serializable {...}HashTable继承的是Dictionary,HashMap继承的是AbstractMap

HashTable的方法都是同步的,使用方法基本和HashMap是一致的
public synchronized V put(K key, V value) {
public synchronized boolean isEmpty() {    return count == 0;}

3.LinkedHashMap也是实现了Map接口
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

从申明中可以看出,LinkedHashMap继承了HashMap类,不同的地方在于使用了链表,因此可以保证元素的插入顺序,先进先出

4.TreeMap也是Map的实现类,它继承了AbstractMap申明方法如下:
public class TreeMap<K,V>    extends AbstractMap<K,V>    implements NavigableMap<K,V>, Cloneable, java.io.Serializable

TreeMap中的元素也是有序的,默认的排序规则是按照key的字段顺序升序排序的

总结一下:这四个都是Map接口的实现类保证key是唯一的,不可重复

HashMap、HashTable不保证元素的顺序LinkedHashMap是有序的,按照插入顺序,先进先出TreeMap是保证元素顺序的,默认按照字典排序升序,支持自定义排序规则
HashMap支持key和value都是null,LinkedHashMap继承HashMap所以也是支持的TreeMap不允许key是null,但是允许value是nullHashTable不允许null值,key和value都不允许

HashMap、LinkedHashMap、TreeMap都不是线程安全的,HashTable是线程安全的

HashTable的父类是Dictionary,HashMap、LinkedHashMap、TreeMap的父类AbstracMap


原文地址:https://www.cnblogs.com/wangflower/p/12235743.html

时间: 2024-10-02 21:36:54

HashMap、HashTable、LinkedHashMap、TreeMap使用和区别的相关文章

HashMap,HashTable,LinkedHashMap,TreeMap的区别

1.   Map简介 Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值.Map用于存储键值对,根据键得到值,因此不允许键重复,值可以重复. 1.1.  HashMap HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度.HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap

详解HashMap,Hashtable,LinkedHashMap,TreeMap的异同点

Map Map是是一种数据结构,它是把数据按照key-value键值对的形式保存起来,一般来说,Map的定义是key是独一无二的,即存在map中的各个键一定是不能相同的.当然,对于一般的基本数据类型和String类型,对象都是可以自动比较的,而对于其它的复杂类型,如果你没有在类中定义equals方法,则map中是可以存放相同的键的,因为它无法判断两个对象是否相同,所以在使用map存储数据时,键的数据类型一定要覆写equals方法,以提供可以判断两个对象是否相等的方法. Map并不是Collect

HashMap Hashtable LinkedHashMap 和TreeMap

java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap. Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复. HashMap是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的. HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;

集合类源码(六)Map(HashMap, Hashtable, LinkedHashMap, WeakHashMap)

HashMap 内部结构 内部是一个Node数组,每个Node都是链表的头,当链表的大小达到8之后链表转变成红黑树. put操作 final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; // 当table为空或者长度为0,执行resize if ((tab = table) == null || (n

HashMap,LinkedHashMap,TreeMap之间的区别

Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复. HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度.HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致.如果需要同步,可以用Collections的synchronizedMap方法使HashMap具

HashMap\HashTable\ConcurrentHashMap的原理与区别

HashTable: 底层数组+链表,key与value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低. 初始size为11,扩容:newsize = oldsize*2 + 1 计算index的方法:index = (hash & 0x7FFFFFFF)%tab.length HashMap: 底层数组+链表实现,可以存储null键和null值,线程不安全 初始size为16,扩容newsize = oldsize*2,size一定为2的n次幂

HashMap、HashTable、LinkedHashMap和TreeMap用法和区别

Java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap Map用于存储键值对,根据键得到值,因此不允许键重复,值可以重复. HashMap就是一张hash表,键和值都没有排序: TreeMap以红-黑树结构为基础,键值按顺序排列: LinkedHashMap保存了插入时的顺序: Hashtable是同步的(而HashMap是不同步的).所以如果在线程安全的环境下应该多使用HashM

HashMap,LinkedHashMap,TreeMap的区别(转)

Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复.Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的.HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致.如果需要同步,可以用 Collections的synchronizedM

HashMap,HashTable,TreeMap区别和用法

开始学HashTable,HashMap和TreeMap的时候比较晕,觉得作用差不多,但是到实际运用的时候又发现有许多差别的.需要大家注意,在实际开发中以需求而定. java为数据结构中的映射定义了一个接口java.util.Map,而HashMap Hashtable和TreeMap就是它的实现类.Map是将键映射到值的对象,一个映射不能包含重复的键:每个键最多只能映射一个一个值. Hashmap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快

HashMap和LinkedHashMap的比较使用

由于现在项目中用到了LinkedHashMap,并不是太熟悉就到网上搜了一下. import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; public class TestLinkedHashMap {   public static void main(String args[])   {    System.out.println("**