Map接口中的类及方法

Map接口

 * |---Map:双列数据,存储Key-value对的数据 ----类似于函数:y=f(x)
 *      |---HashMap:作为Map的主要实现类:线程不安全,效率高,存储null的key和value
 *           |---LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历
 *                  原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。
 *                  对于频繁的遍历操作,此类执行效率高于HashMap。
 *      |---TreeMap:保证按照添加的key-value进行排序,实现排序遍历。此时考虑key的自然排序和定制排序。
 *                  底层使用红黑树
 *      |---Hashtable:作为古老的实现类:线程安全,效率低,不存储null的key和value
 *          |---Properties:常用来处理配置文件。key和value都是String类型
  • HashMap的底层:数组+链表 (jdk 7及以前)
    ------------------------数组+链表+红黑树 (jdk 8)

面试题

  • 1.HashMap的底层实现原理?
  • 2.HashMap 和 Hashtable的异同?

1.HashMap与Hashtable都实现了Map接口。由于HashMap的非线程安全性,效率上可能高于Hashtable。Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
2. HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
3.HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
4.Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
5.Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

  • 3.CurrentHashMap 与 Hashtable的异同?

二、Map结构的理解

  • Map中的key:无序的,不可重复的,使用Set存储所有的key ----> key所在的类要重写equals()和hashCode()
  • Map中的value:无序的,可重复的,使用Collection存储所有的value。 —> value所在的类要重写equals()。
  • 一个键值对:key-value构成了一个Entry对象
  • Map中的entry:无序的,不可重复的,使用Set储存所有的entry

三、HashMap的底层实现原理

  • HashMap map = new HashMap();
  • 在实例化以后,底层创建了长度是16的一维数组Entry[] table.
  • 可能已经执行过多次put()
  • map.put(key1,value1);
  • 首先,计算key1所在类的HashCode()计算key1哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存放位置。
  • 如果此位置上的数据为空,此时的key1-value1添加成功
  • 如果此位置上的数据不为空,(意味着此位置上存在一个或多个数据),比较key1和已经存在的一个或多个数据的哈希值

jdk 8 相较于jdk 7 在底层实现方法不同

  • 1.new HashMap():底层没有创建一个长度为16的数组
  • 2.jdk 8 底层的数组是:Node[],而非entry[]
  • 3.首次调用put()方法时,底层创建长度为16的数组
  • 4.jdk7底层结构只有:数组+链表 , jdk 8 中底层结构:数组+链表+红黑树
  • DEFAULT_INITIAL_CAPACITY : HashMap的默认容量: 16
  • DEFAULT_LOAD_FACTOR: HashMap的默认加载因子: 0.75
  • threshold: 扩容的临界值, = 容量填充因子: 160.75 = 12
  • TREEIFY_THRESHOLD: Bucket中链表长度大于该默认值,转化为红黑树, 8
  • MIN_TREEIFY_CAPACITY: 桶中的Node被树化时最小的hash表容量。 64
 元视图操作的方法:
      Set keySet():返回所有key构成的Set集合
      Collection values():返回所有value构成的Collection集合
      Set entrySet():返回所有key-value对构成的Set集合

面试题

  • 谈谈你对HashMap中put/get方法的认识?如果了解再谈谈HashMap的扩容机制?默认大小是多少?什么是负载因子(或填充比)? 什么是吞吐临界值(或阈值、 threshold)?
  • 负载因子值的大小,对HashMap有什么影响

 负载因子的大小决定了HashMap的数据密度。
 负载因子越大密度越大,发生碰撞的几率越高,数组中的链表越容易长,造成查询或插入时的比较次数增多,性能会下降。
 负载因子越小,就越容易触发扩容,数据密度也越小,意味着发生碰撞的几率越小,数组中的链表也就越短,查询和插入时比较的次数也越小,性能会更高。但是会浪费一定的内容空间。而且经常扩容也会影响性能,建议初始化预设大一点的空间。
 按照其他语言的参考及研究经验,会考虑将负载因子设置为0.7~0.75,此时平均检索长度接近于常数。

  • Collection 和 Collections的区别

答:Collection是集合类的上级接口,继承于他的接口主要有Set 和List.Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作

你可能感兴趣的:(java)