【Java集合之Map】HashMap、HashTable、TreeMap、LinkedHashMap区别

时间:2022-12-01 19:14:04

前言

Java为数据结构中的映射定义了一个接口java.util.Map,它有四个实现类,分别是HashMap、HashTable、LinkedHashMap和TreeMap。本节实例主要介绍这4中实例的用法和区别

几种Map类结构

public class Hashtable extends Dictionary implements Map, Cloneable, Serializable public class HashMap extends AbstractMap implements Map, Cloneable, Serializable public class LinkedHashMap extends HashMap implements Map public class TreeMap extends AbstractMap implements SortedMap, NavigableMap, Cloneable, Serializable public interface SortedMap extends Map

接下来详细测试一下

测试

/** * @描述:Map测试 * @作者:CYH * @版本:V1.0 * @创建时间::2016-12-20 */
public class MapTest {

    public static void main(String[] args) {
        Map<Integer, String> hashMap = new HashMap<Integer, String>();    
        System.out.println("插入HashMap-key顺序:");
        for(int i=0; i<10; i++){
            Random random = new Random();
            int rs = random.nextInt(1000);
            hashMap.put(rs, "v*"+rs);
            System.out.println(rs);
        }
        System.out.println("HashMap集合输出:"+hashMap);

        Map<Integer, String> treeMap = new TreeMap<Integer, String>();    
        System.out.println("插入TreeMap-key顺序:");
        for(int i=0; i<10; i++){
            Random random = new Random();
            int rs = random.nextInt(1000);
            treeMap.put(rs, "v*"+rs);
            System.out.println(rs);
        }
        System.out.println("TreeMap集合输出:"+treeMap);

        Map<Integer, String> linkedHashMap = new LinkedHashMap<Integer, String>();    
        System.out.println("插入LinkedHashMap-key顺序:");
        for(int i=0; i<10; i++){
            Random random = new Random();
            int rs = random.nextInt(1000);
            linkedHashMap.put(rs, "v*"+rs);
            System.out.println(rs);
        }
        System.out.println("LinkedHashMap集合输出:"+linkedHashMap);
    }
}

测试结果:

插入HashMap-key顺序:
531
122
279
232
644
525
131
991
374
68
HashMap集合输出:{68=v*68, 374=v*374, 279=v*279, 991=v*991, 531=v*531, 232=v*232, 525=v*525, 644=v*644, 131=v*131, 122=v*122}
插入TreeMap-key顺序:
729
844
297
424
445
286
371
883
453
707
TreeMap集合输出:{286=v*286, 297=v*297, 371=v*371, 424=v*424, 445=v*445, 453=v*453, 707=v*707, 729=v*729, 844=v*844, 883=v*883}
插入LinkedHashMap-key顺序:
152
530
997
772
484
810
18
478
837
951
LinkedHashMap集合输出:{152=v*152, 530=v*530, 997=v*997, 772=v*772, 484=v*484, 810=v*810, 18=v*18, 478=v*478, 837=v*837, 951=v*951}

总结

共同点

HashMap,LinkedHashMap,TreeMap都属于Map;Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。

不同点

1、HashMap键无序,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,在Map 中插入、删除和定位元素,HashMap 是最好的选择;
2、LinkedHashMap 是HashMap的一个子类,键保存了插入的顺序,使用Iterator遍历时,得到的也是插入顺序的记录;
3、TreeMap默认按键的升序排序,可以定制。
4、HashTable 线程安全,键不能为null,与HashMap类似,但效率较低,HashMap如果需要实现同步,可以使用Collections. synchronizedMap或ConcurrentHashMap 。