关于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 时,得到的记录是排过序的。
为什么重写 equals 还要重写 hashcode?
HashMap 中,如果要比较 key 是否相等,要同时使用这两个函数!因为自定义的类的 hashcode() 方法继承于 Object 类,其 hashcode 码为默认的内存地址,这样即便有相同含义的两个对象,比 较也是不相等的。HashMap 中的比较 key 是这样的,先求出 key 的 hashcode(),比较其值是否相 等,若相等再比较 equals(),若相等则认为他们是相等的。若 equals()不相等则认为他们不相等。 如果只重写 hashcode()不重写 equals()方法,当比较 equals()时只是看他们是否为同一对象(即 进行内存地址的比较),所以必定要两个方法一起重写。HashMap 用来判断 key 是否相等的方法, 其实是调用了 HashSet 判断加入元素 是否相等。重载 hashCode()是为了对同一个 key,能得到 相同的 Hash Code,这样 HashMap 就可以定位到我们指定的 key 上。重载 equals()是为了向 HashMap 表明当前对象和 key 上所保存的对象是相等的,这样我们才真正地获得了这个 key 所对 应的这个键值对。
Object 若不重写 hashCode()的话,hashCode()如何计算出来的?
Object 的 hashcode 方法是本地方法,也就是用 c 语言或 c++ 实现的,该方法直接返回 对象的 内存地址。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值