首页 > 试题广场 >

说一下map的分类和常见的情况

[问答题]

请你介绍一下map的分类和常见的情况

java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap. Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。 Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。 Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。 LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。 TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。 一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列. HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为NULL,允许多条记录的值为NULL。 HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致性。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。 Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。 LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。 在遍历的时候会比HashMap慢TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iterator遍历TreeMap时,得到的记录是排过序的。
编辑于 2019-01-07 08:59:52 回复(3)

借用网上一张图(出处未知)



父类 线程安全 允许null值 扩容方式 哈希
HashMap
AbstractMap
key和value都允许
默认大小是16,而且一定是2的指数,2*old
自己实现的hash函数
Hashtable
Dictionary
key和value都不允许
默认大小是11,old*2+1
key.hashCode()

  • HashMap结构是数组+链表(节点超过八个自动转成红黑树)
  • Hashtable的每一个方法都加上了synchronized,因此是线程安全的
  • 一般不使用Hashtable,使用Collections.synchronizedMap(Map map);将非线程安全的map转换成线程安全的map。或者使用java.util.concurrent.ConcurrentHashMap
  • ConcurrentHashMap1.8之前是使用segment分段锁实现,1.8之后直接采用一个大数组使用cas和synchronized(针对首节点进行加锁)
  • TreeMap是利用红黑树构造的有序map
  • LinkedHashMap底层是双向链表,可以实现LRU

更多内容就谷歌百度知乎……吧

编辑于 2019-08-17 23:38:02 回复(0)
https://tech.meituan.com/2016/06/24/java-hashmap.html
发表于 2019-03-25 09:28:41 回复(0)
map的分类和常见的情况:
Map主要有HsahMap、HashTable、TreeMap
1、HsahMap非线程安全、可以使用null作为key,在多线程中可用 ConcurrentHashMap 替代
2、HashTable线程安全、不支持 null 键和值性能不如 ConcurrentHashMap
3、TreeMap红黑树顺序访问的 Map,实现了 key 的自然排序
发表于 2020-08-02 15:56:11 回复(0)
(1).Map分HashMap,TreeMap,HashTable,LinkedHashMap,ConcurrentHashMap。
(2).HashMap:允许空键值,无序,线程不安全。
      TreeMap:value可以为空,key不能为空,有序,需要实现Comparator接口,线程不安全。
      HashTable:不允许空键值,无序,线程安全。
      ConcurrentHashMap:不允许空键值,无序,线程安全。
发表于 2020-02-28 12:57:59 回复(0)
java为数据结构中的映射定义了一个接口java.util.Map。
它有四个实现类,分别是HashMap、Hashtable、LinkedHashMap 和TreeMap。

 Map接口:主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。
 
HashMap :它根据键的 HashCode 值存储数据,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。

Hashtable :将HashMap内部方法大多使用synchronized的关键字修饰得到的,没有做并发相关的优化,目前主要使用concurrentHashMap替代。
 
 LinkedHashMap 是 HashMap的一个子类,保存了记录的插入顺序,再使用Iterator遍历时,先得到的数据肯定是先插入的,也可以在构造时用带参数,按照应用次数排序。遍历时会比HashMap慢,但当HashMap容量很大,实际数据很少时,遍历起来可能会必LinkedHashMap慢,因为LinkedHashMap的遍历只和实际数据有关,和容量无关。
 
 TreeMap 实现SortMap接口,能够把它保存的记录根据键排序,默认键值是升序排序的,也可以指定排序的比较器,当遍历时,得到的记录是排序的。
发表于 2019-11-18 15:40:05 回复(0)
Ly~头像 Ly~
java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap. Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。 Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的
发表于 2019-05-06 00:00:50 回复(0)
考点:java基础 参考回答: java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap. Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。 Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。 Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。 LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。 TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。 一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列. HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为NULL,允许多条记录的值为NULL。 HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致性。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。 Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。 LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。 在遍历的时候会比HashMap慢TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用Iterator遍历TreeMap时,得到的记录是排过序的。
发表于 2019-04-30 21:41:06 回复(0)
Map有 HashMap TreeMapHashtable。 1 HashMap 线程不安全 键 值不允许为null 并且没顺序 2 Hashtable 线程安全 键 值允许为null 并且没顺序 3 TreeMap 线程不安全 键 值不允许为null 并且没顺序
发表于 2019-04-27 16:32:34 回复(0)
通过键值对的形式存储集合
发表于 2019-04-25 16:13:28 回复(0)
Treemap:基于红黑树,有序,速度比hashmap慢 Hashmap:基于hash,无序
发表于 2019-04-10 23:23:09 回复(0)
hashmap,hashtable,lingkedhashmap,treemap
编辑于 2019-04-10 08:49:32 回复(0)
砼头像
好吧
发表于 2019-03-19 19:57:10 回复(0)
HashMap,链表法存储,entry[]数组,线程不安全,可能死锁 concurrentHashMap,segment数组,每个segent下维护一组entry[]数组,每个segment是一把锁,线程安全 LinkedHashMap
发表于 2019-02-14 21:04:48 回复(1)