广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java集合框架之Map详解
  • 807
分享到

Java集合框架之Map详解

2024-04-02 19:04:59 807人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录1、Map的实现2、HashMap 和 Hashtable 的区别3、介绍下对象的 hashCode()和equals(),使用场景4、HashMap和TreeMap应该怎么选择

1、Map的实现

  • HashMap
  • Hashtable
  • LinkedHashMap
  • TreeMap
  • ConcurrentHashMap

2、HashMap 和 Hashtable 的区别

  • HashMap:底层是基于数组+链表实现,非线程安全的,默认容量是16、允许有空的健和值
  • Hashtable:基于哈希表实现,线程安全的(加了synchronized),默认容量是11,不允许有空的健和值

3、介绍下对象的 hashCode()和equals(),使用场景

hashCode:

顶级类Object里面的方法,所有的类都是继承Object,返回是一个int类型的数

根据一定的hash规则(存储地址,字段,长度等),映射成一个数值,即散列值

@Override
public int hashCode() {
     return Objects.hash(age,name,time);
}

equals:

顶级类Object里面的方法,所有的类都是继承Object,返回是一个boolean类型

根据自定义的匹配规则,用于匹配两个对象是否一样,一般逻辑如下:

1、判断地址是否一样

2、非空判断 和 Class类型判断

3、强转

4、对象里面的字段一一匹配

@Override
public boolean equals(Object obj) {
    if (obj == this)
        return true;
    if (obj == null || getClass() != obj.getClass())
        return false;
    User user = (User) obj;
    return age == user.age && Objects.equals(name, user.name) && Objects.equals(time, user.time);
}

使用场景:对象比较、或者集合容器里面排重、比较、排序

4、HashMap和TreeMap应该怎么选择,使用场景

hashMap:

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

treeMap:

  • 使用存储结构是一个平衡二叉树->红黑树,可以自定义排序规则,要实现Comparator接口
  • 能便捷的实现内部元素的各种排序,但是一般性能比HashMap差,适用于安装自然排序或者自定义排序规则 (写过微信支付签名工具类就用这个类)

5、Set和Map的关系 TODO

核心就是不保存重复的元素,存储一组唯一的对象

set的每一种实现都是对应Map里面的一种封装,

HashSet对应的就是HashMap,treeSet对应的就是treeMap

  • set:无序,不允许存在重复的元素
  • list:有序,可以存在重复元素
  • set 和 list 对比: 都是Collection的子接口,Collection是集合类;
  • set 检查元素效率低下,删除和插入的效率高,插入和删除不会引起元素的位置变化;
  • list 和数组类似,List可以动态增长,查找元素的效率较高,插入元素和删除元素效率低,因为会引起其他元素位置发生变化
  • map: Map接口不是Collection接口的继承,而是从自己的用于维护键值对关联的接口层次结构入手,按定义,该接口描述了从不重复的键到值的映射

6、常见Map的排序规则是怎样的?

按照添加顺序使用LinkedHashMap,按照自然排序使用TreeMap,自定义排序 TreeMap(Comparetor c)

7、如果需要线程安全,且效率高的Map,应该怎么做?

  • 多线程环境下可以用concurrent包下的ConcurrentHashMap,或者使用Collections.synchronizedMap(),
  • ConcurrentHashMap虽然是线程安全,但是他的效率比Hashtable要高很多使用
  • Collections.synchronizedMap包装后返回的map是加锁的

8、介绍下 HashMap

  • HashMap底层(数组+链表+红黑树 jdk8才有红黑树),在JDK1.8中,链表的长度大于8,链表会转换成红黑树
  • 数组中每一项是一个链表,即数组和链表的结合体
  • node<K,V>[] table

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

数组的一个小格代表一个bucket

9、什么是Hash碰撞?常见的解决办法有哪些,hashmap采用哪种方法?

  • hash碰撞的意思是不同key计算得到的Hash值相同,需要放到同个bucket中
  • 常见的解决办法:链表法、开发地址法、再哈希法等
  • HashMap采用的是链表法

10、HashMap底层是 数组+链表+红黑树,为什么要用这几类结构呢?

  • 数组:Node<K,V>[] table ,根据对象的key的hash值确定在数组里面是哪个节点 - 链表:作用是解决hash冲突,将hash值一样的对象存在一个链表放在hash值对应的槽位
  • 红黑树:JDK8使用红黑树来替代超过8个节点的链表,主要是查询性能的提升,从原来的O(n)到O(logn),
  • 通过hash碰撞,让HashMap不断产生碰撞,那么相同key的位置的链表就会不断增长,
  • 当对这个Hashmap的相应位置进行查询的时候,就会循环遍历这个超级大的链表,性能就会下降,所以改用红黑树

11、为什么选择红黑树而不用其他树,比如二叉查找树,为什么不一直开始就用红黑树,而是到8的长度后才变换

  • 二叉查找树在特殊情况下也会变成一条线性结构,和原先的链表存在一样的深度遍历问题,查找性能就会慢,
  • 使用红黑树主要是提升查找数据的速度,红黑树是平衡二叉树的一种,插入新数据后会通过左旋,右旋、变色等操作来保持平衡,解决单链表查询深度的问题
  • 数据量少的时候操作数据,遍历线性表比红黑树所消耗的资源少,且前期数据少平衡二叉树保持平衡是需要消耗资源的,所以前期采用线性表,等到一定数之后变换到红黑树

12、了解ConcurrentHashMap吗?为什么性能比hashtable高,说下原理

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

13、jdk1.7和jdk1.8里面ConcurrentHashMap实现的区别有没了解

  • JDK8之前,ConcurrentHashMap使用锁分段技术,将数据分成一段段存储,每个数据段配置一把锁,即segment类,这个类继承ReentrantLock来保证线程安全 【技术点:Segment + HashEntry】
  • JKD8的版本取消Segment这个分段锁数据结构,底层也是使用Node数组+链表+红黑树,从而实现对每一段数据就行加锁,也减少了并发冲突的概率,CAS(读)+Synchronized(写)【技术点:Node + Cas + Synchronized】

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!   

--结束END--

本文标题: Java集合框架之Map详解

本文链接: https://www.lsjlt.com/news/141221.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java集合框架之Map详解
    目录1、Map的实现2、HashMap 和 Hashtable 的区别3、介绍下对象的 hashCode()和equals(),使用场景4、HashMap和TreeMap应该怎么选择...
    99+
    2022-11-13
  • Java集合框架之Set和Map详解
    目录Set接口HashSetTreeSetMap接口HashMapTreeMapSet接口 set接口等同于Collection接口,不过其方法的行为有更严谨的定义。set的add...
    99+
    2022-11-12
  • Java基础之集合框架详解
    目录一、前言二、集合的由来?三、集合和数组的区别?四、Collection集合的功能概述?五、Collection集合存储字符串并遍历?(迭代器)六、...
    99+
    2022-11-12
  • 详解Java集合类之Map篇
    目录1.Map接口介绍2.Map接口分析3.Map接口方法4.Map遍历方式1.Map接口介绍 Map用于保存具有映射关系的数据:Key - Value 对于Set,底层其实依然是一...
    99+
    2022-11-13
  • Java 详解Map集合之HashMap和TreeMap
    目录HashMap创建HashMap添加元素访问元素删除元素TreeMap创建TreeMap添加元素访问元素删除元素HashMap、TreeMap区别 Map接口储存一组成对的键-值...
    99+
    2022-11-13
  • Java基础详解之集合框架工具Collections
    目录一、Collections二、Collections中的常见方法三、Aarrays:用于对数组操作的工具类四、二分查找过程中的默认比较器五、集合转化为数组六、增强for循环七、关...
    99+
    2022-11-12
  • Java集合类之Map集合的特点及使用详解
    目录1、Map集合概述和使用1.1 Map集合概述1.2 Map集合常用方法1.3 Map集合的遍历1、Map集合概述和使用 1.1 Map集合概述 java.util接口 Map&...
    99+
    2022-11-13
  • Java Map集合用法详解
    目录Map集合的概述常用方法:遍历方式:Map的实现类:HashMapTreeMap集合嵌套(补充知识):高频面试题1、Map2、HashMap的底层实现Map集合的概述 概述:in...
    99+
    2022-11-12
  • Java框架之Maven SSM集合
    目录SSMMaven什么是mavenMaven好处,为什么要用Maven三种仓库坐标概念总结SSM @Controller,@Service本质都是@Component,作用是new...
    99+
    2022-11-12
  • Java集合框架之Stack Queue Deque使用详解刨析
    目录1. Stack1.1 介绍1.2 常见方法2. Queue2.1 介绍2.2 常见方法3. Deque3.1 介绍3.2 常见方法1. Stack 1.1 介绍 Stack 栈...
    99+
    2022-11-12
  • Java集合框架之List ArrayList LinkedList使用详解刨析
    目录1. List1.1 List 的常见方法1.2 代码示例2. ArrayList2.1 介绍2.2 ArrayList 的构造方法2.3 ArrayList 底层数组的大小3....
    99+
    2022-11-12
  • Java集合之Map接口与实现类详解
    目录初识Map:Map接口没有从Collection接口继承,Map接口用于维护“键-值”对数据,这个“键-值”对就是Map中的元素,...
    99+
    2022-12-08
    Java 集合 Map接口 Java Map接口 Java实现Map接口
  • Java集合框架LinkedList详解及实例
    Java集合框架LinkedList详解LinkedList定义package java.util;public class LinkedList<E> extends AbstractSequentialList<E&g...
    99+
    2023-05-31
    java linkedlist ava
  • Java常用集合之Set和Map的用法详解
    目录常用Set集合Set集合的特点HashSet创建对象常用方法遍历常用Map集合Map集合的概述HashMap创建对象常用方法遍历HashMap的key去重原理常用Set集合 Se...
    99+
    2022-11-13
  • Java集合系列之JCF集合框架概述
    Java集合框架(Java Collections Framework,JCF)是Java平台提供的一套用于存储、操作和管理对象的集...
    99+
    2023-09-23
    java
  • Java数据结构之集合框架与常用算法详解
    目录1 集合框架1.1 集合框架概念1.2 容器涉及的数据结构2 算法2.1 算法概念2.2 算法效率3 时间复杂度3.1 时间复杂度概念3.2 大O的渐进表示法3.3 推导大O阶方...
    99+
    2023-05-18
    Java集合框架 Java算法
  • Java复习之集合框架总结
    俗话说:温故而知新。想想学过的知识,就算是以前学得很不错,久不用了,就会忘记,所以温习一下以前学习的知识我认为是非常有必要的。而本篇文件温习的是 Java基础中的集合框架。为什么会有集合框架?平时我们用数组存储一些基本的数据类型,或者是引用...
    99+
    2023-05-31
    java 集合框架 ava
  • Java集合框架超详细小结
    目录一:Collection集合1.1集合概述:1.2集合架构1.3Collection集合常用方法二:迭代器Iterator2.1Iterator接口2.2Iterator的实现原...
    99+
    2022-11-12
  • Java基础Map集合详析
    目录一、概述二、创建Map集合的对象方式四、Map的获取方法五、Map集合的遍历方式方式一:方式二:一、概述 Interface Map k:键的类型;V:值的类型将键映射到值的对象...
    99+
    2022-11-13
  • Java中Map集合的常用方法详解
    目录1、V put(K key, V value)2、void putAll(Map<? extends K,? ext...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作