zoukankan      html  css  js  c++  java
  • Map集合

     

     Map集合概述

      存储键值对应关系的数据,也就是映射关系。
    Map集合特点
      Map  集合中不能存在相同的键,一个键只能对应一个值,键相同值覆盖。
      Map 集合的数据结构 只跟键有关 ,跟值无关。
      基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。

    了解Map集合,Map集合有哪些实现

    hashMap

    hashTable

    LinkedHashMap

    TreeMap

    ConcurrentHashMap

    HashMap和HashTable的区别

      HashMap不是线程安全的,HashTable是线程安全的一个Collection。
      HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
      HashMap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。
      HashMap允许null key和null value,而hashtable不允许。
      HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
      HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
      Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
    最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问
      Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
      Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。

    .hashCode()和equals()方法使用场景

      hashCode():顶级父类object当中的方法,返回值类型为int类型的值,根据一定的规则生成一个数组,数组保存的就是hash值;

      equals():顶级父类object当中的方法,根据一定的比较规则,判断对象是否一致;

      底层一般逻辑:

        1.判断两个对象的内存地址是否一样;

        2.非空判断和class类型判断;

        3.强转;

        4.对象中的字段一一匹配;

    public class Title {
        private int id;
        private String name;
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        @Override
        public boolean equals(Object o) {
            //判断两个对象的内存地址是否一样
            if (this == o) return true;
            //非空判断和class类型判断
            if (o == null || getClass() != o.getClass()) return false;
            //强转
            Title title = (Title) o;
            //对象中的字段一一匹配
            return id == title.id &&
                    Objects.equals(name, title.name);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(id, name);
        }
    }

    HashMap和TreeMap应该如何选择

      HashMap:

      底层采用数组+链表结构,可以实现快速的存储和检索,但是数据时无序的,适用于在map当中插入删除或者获取元素;

      TreeMap:

      存储结构是一个平衡二叉树,具体实现方式为红黑树,默认采用自然排序,可以自定义排序规则,但是需要实现Comparator,能够便捷的实现内部元素的各种排序,但是性能比HashMa差,适用于按照具体自然排序和自定义排序规则;

    Set和Map的关系

      Map是一组键值对的结构,具有极快的查找速度;

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

      Set当中每一种实现都对应Map;

      HashSet对应的底层就是new HashMap,TreeSet对应的底层就是new TreeMap;

    常见的Map排序规则

      按照添加规则使用LinkedHashMap,按照自然排序使用TreeMap;

    如何保证Map线程安全

      多线程环境下,可以使用concurrent包下有一个ConcurrentHashMap,它使用分段锁来保证线程安全;

      Collections.synchronizedMap保证线程安全,效率比HashTable高;

  • 相关阅读:
    使用 requests 维持会话
    使用 requests 发送 POST 请求
    使用 requests 发送 GET 请求
    requests 安装
    使用 urllib 分析 Robots 协议
    使用 urllib 解析 URL 链接
    使用 urllib 处理 HTTP 异常
    使用 urllib 处理 Cookies 信息
    使用 urllib 设置代理服务
    按单生产程序发布
  • 原文地址:https://www.cnblogs.com/dabrk/p/12508791.html
Copyright © 2011-2022 走看看