HashMap,HashTable,LinkedHashMap,TreeMap的区别

1.  
Map简介

Map 集合类用于存储元素对(称作“键”和“值”),其中每个键映射到一个值。Map用于存储键值对,根据键得到值,因此不允许键重复,值可以重复。

1.1. 
HashMap

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

1.1.1. HashMap实例


HashMapTest.java

package map;

import java.util.HashMap;

import java.util.Set;

publicclass HashMapTest {

    publicstaticvoid main(String[] args) {

       HashMap<String, String> hashMap = new HashMap<String,String>();

       hashMap.put(null, null);

       hashMap.put("aa", null);

       hashMap.put("bb", "123");

       hashMap.put("dd", "456");

       hashMap.put("cc", "789");

       Set<String> keySet = hashMap.keySet();

       for (String key : keySet) {

           System.out.println(key+":"+hashMap.get(key));

       }

    }

}

运行结果如下:

null:null

dd:456

aa:null

bb:123

cc:789

从结果中可以看出,HashMap中存放的值可以是null,key也可以是null,输出的结果是无序的

1.2. 
LinkedHashMap

LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序

1.2.1.  
LinkedHashMap实例


LinkedHashMapTest

package map;

import java.util.LinkedHashMap;

import java.util.Map;

import java.util.Set;

publicclass LinkedHashMapTest {

    publicstaticvoid main(String[] args) {

       // TODO Auto-generated method stub

       Map<String, String> map = new LinkedHashMap<String, String>();

       map.put(null, null);

       map.put("aa", null);

       map.put("bb", "123");

       map.put("dd", "456");

       map.put("cc", "789");

       Set<String> keySet = map.keySet();

       for (String key : keySet) {

           System.out.println(key + ":" + map.get(key));

       }

    }

}

运行结果:

null:null

aa:null

bb:123

dd:456

cc:789

从结果中可以发现,LinkedHashMap输出与输入的顺序保持一致.

1.3. 
TreeMap

TreeMap可以对放入里面的key和值进行排序.

1.3.1.  
TreeMap实例


TreeMapTest

package map;

import java.util.Map;

import java.util.Set;

import java.util.TreeMap;

publicclass TreeMapTest {

    publicstaticvoid main(String[] args) {

       Map<String, String> map = new TreeMap<String, String>();

       // map.put(null, null);

       map.put("aa", null);

       map.put("bb", "123");

       map.put("dd", "456");

       map.put("cc", "789");

       Set<String> keySet = map.keySet();

       for (String key : keySet) {

           System.out.println(key + ":" + map.get(key));

       }

    }

}

运行结果:

aa:null

bb:123

cc:789

dd:456

从结果中可以看出,TreeMap中不允许key为null,输出的结果默认按自然排序.

1.4. 
HashTable

1.4.1.  
HashMap与HashTable的区别

1.      
HashMap是非线程安全的,而HashTable的方法是Synchronize,是线程安全的.如果需要同步,可以用Collections.synchronizedMap(HashMap
map)方法使HashMap具有同步的能力。

2.      
Hashtable不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,然而,这也导致了Hashtable在写入时会比较慢。

时间: 2024-10-17 06:01:46

HashMap,HashTable,LinkedHashMap,TreeMap的区别的相关文章

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

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

HashMap,LinkedHashMap,TreeMap的区别(转)

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

HashMap Hashtable LinkedHashMap 和TreeMap

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

hashMap、hashTable、treeMap的区别

1.hashTable是线程安全的.hashMap不是线程安全的 hashmap 线程不安全 允许有null的键和值 效率高一点. 方法不是Synchronize的要提供外同步 有containsvalue和containsKey方法 HashMap 是Java1.2 引进的Map interface 的一个实现 HashMap是Hashtable的轻量级实现 hashtable 线程安全 不允许有null的键和值 效率稍低. 方法是是Synchronize的 有contains方法方法 .Ha

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

JDK1.8中的HashMap.HashTable, ConcurrentHashMap有什么区别?

JDK1.8中的HashMap,HashTable,ConcurrentHashMap有什么区别? 答:HashMap是线程不安全的,底层采用数组+链表+红黑树的结构 HashTable是线程安全的,因为使用了Synchronized锁住了整个table,底层采用了数组+链表 ConcurrentHashMap是线程安全的,采用了CAS+同步锁Synchronized对链表头节点进行锁定,底层使用数组+链表+红黑树 HashMap的key和value可以是null,其他两个不行. 原文地址:ht

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("**