关于集合框架Map,你所不知道的知识!

前言

相信很多同学都了解集合框架Map。但不少同学对Map的了解仅仅限于HashMap,那不妨看看我的这篇文章,或许你会有所收获!

常用Map有哪些

答:HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap

对比HashMap和Hashtable 的区别

答:

HashMap:底层是基于数组+链表实现,属于非线程安全,默认容量是16,允许有空的健和值。

Hashtable:底层是基于哈希表实现,属于线程安全(加了synchronized),默认容量是11,不允许有null的健和值。

hashCode()和equals()的含义与使用场景

答:

hashcode():顶级类Object里面的方法,所有的类都是继承Object,返回是一个int类型的数。根据一定的hash规则(存储地址,字段,长度等),映射成一个数组,即散列值。

equals() :顶级类Object里面的方法,所有的类都是继承Object,返回是一个boolean类型。根据自定义的匹配规则,用于匹配两个对象是否一样,一般逻辑如下:1.判断地址是否一样、2.非空判断和Class类型判断、3.强转、4.对象里面的字段一一匹配。

代码实战如下:

import java.util.Date;

import java.util.Objects;

publicclassUser{

privateint age;

private String name;

publicintgetAge(){

return age;

}

publicvoidsetAge(int age){

this.age = age;

}

public String getName(){

return name;

}

publicvoidsetName(String name){

this.name = name;

}

@Override

publicinthashCode(){

return Objects.hash(age,name);

}

@Override

publicbooleanequals(Object obj){

if(this == obj) returntrue;

if(obj == null || getClass() != obj.getClass()) returnfalse;

User user = (User) obj;

return age == user.age && Objects.equals(name, user.name) ;

}

}

实际应用中如何选择HashMap和TreeMap

答:

hashMap: 使用散列桶实现(即数组+链表结构),可以实现快速的存储和检索,但是包含无序的元素,适用于在map中插入、删除和定位元素。

treeMap:使用存储结构是一个平衡二叉树,具体实现是红黑树,可以自定义排序规则,要实现Comparator接口,能便捷的实现内部元素的各种排序,但是一般性能比HashMap差,适用于自定义排序规则。

解析Set和Map的关系

答:set的核心就是集合中元素不可重复,存储一组唯一的对象。

set中的每一种实现都是对应Map里面的一种封装,HashSet对应的就是HashMap,TreeSet对应的就是TreeMap。

常见Map的排序规则是怎样的

答:按照添加顺序排序使用LinkedHashMap,按照自然排序与自定义排序用TreeMap。

线程安全且效率高的Map是哪个

答:多线程环境下可以用concurrent包下的ConcurrentHashMap或者使用Collections.synchronizedMap。ConcurrentHashMap虽然是线程安全,但是他的效率比Hashtable要高很多.

为什么Collections.synchronizedMap是线程安全的

答:使用Collections.synchronizedMap包装后返回的map是加锁的。

从源码分析HashMap

答:HashMap底层是数组+链表+红黑树实现(jdk8才有红黑树)。数组中的每一项都是一个链表,即数组与链表的结合体。在JDK1.8中,链表的长度大于8,链表会转换成红黑树。

Entry元素是一个key-value的键值对,它持有一个指向下个Entry的引用,每个Entry元素同时也作为当前Entry链表的首节点,也指向了该链表的下个Entry元素。

在这里插入图片描述

Hash碰撞

答:Hash碰撞是指不同key计算得到的Hash值相同,需要放到同个bucket中。

链表的长度大于8之后为什么会转换成红黑树

答:因为数据量少的时候操作数据,遍历线性表比红黑树所消耗的资源少,所以前期采用线性表,等到一定数之后变换到红黑树。

为什么ConcurrentHashMap性能比hashtable高

答:ConcurrentHashMap是线程安全的Map, Hashtable类基本上所有的方法都是采用synchronized进行线程安全控制,高并发情况下效率就会降。而ConcurrentHashMap是采用了分段锁的思想提高性能,锁粒度更细化。

结语

欢迎大家纠正与补充!

以上是 关于集合框架Map,你所不知道的知识! 的全部内容, 来源链接: utcz.com/a/29924.html

回到顶部