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

    Map和set集合有很大的相似。从源码来看,java是先实现了Map,然后通过包装一个value都为空对象的Map,就实现了Set。

    Map是保存键值对的集合。key-value,key保存就是set集合,因此,key不能重复,没有顺序。

    根据keyset的集合不同,Map也有hashmap,hashlinkedmap,sortedmap(接口),treemap,Enummap,跟set一致。

    map有大量的实现类,除上述几个外,还有weakhashmap,identityhashmap。

    map中包含一个内部类,该类封装了一个key-value对。包含三个方法,getkey,getvalue,setvalue

    import java.util.HashMap;
    
    public class MapTest {
        public static void main(String[] args) {
            var map=new HashMap();
            map.put("HashMap",1);
            map.put("LinkedHashMap",1.1);
            map.put("Hashtable",2);
            map.put("SortedMap",3);
            map.put("TreeSet",3.1);
            map.put("WeakHashMap",4);
            map.put("IdentityHashMap",5);
            //如果新的value覆盖了原有的value,该方法返回被覆盖的value
            System.out.println(map.put("Hashtable",109));
            System.out.println(map);
            System.out.println("是否包含值为Hashtable的key:"+map.containsKey("Hashtable"));
            System.out.println("是否包含值为109的value"+map.containsValue(109));
            for(var key:map.keySet()){
                System.out.println(key+"-->"+map.get(key));
            }
            map.remove("TreeSet");
            System.out.println(map);
    
    
        }
    }
    
    
    
    2
    {HashMap=1, Hashtable=109, TreeSet=3.1, SortedMap=3, IdentityHashMap=5, LinkedHashMap=1.1, WeakHashMap=4}
    是否包含值为Hashtable的key:true
    是否包含值为109的valuetrue
    HashMap-->1
    Hashtable-->109
    TreeSet-->3.1
    SortedMap-->3
    IdentityHashMap-->5
    LinkedHashMap-->1.1
    WeakHashMap-->4
    {HashMap=1, Hashtable=109, SortedMap=3, IdentityHashMap=5, LinkedHashMap=1.1, WeakHashMap=4}
    
    Process finished with exit code 0
    

      所有map的实现类都重写了toString方法,调用tosring会返回{kry=value,key=value。。。}

    hashmap和hashtable的关系,类似于hashset和vector的关系。

    hashmap是线程不安全的,hashtable线程安全,较为古老不推荐用。

    hashmap中key值唯一,不能重复。其判断规则与Hashset一致。必须equal与hashcode同时一样。同样不能保证顺序。同样用作类的对象必须实现hashcode方法和equals方法。

    因此只能有一个key为null的值。

    linkedHashMap,也是是使用双向链表维护key的顺序。避免了对key的排序,同时又避免了treemap的成本。

    因为需要维护插入顺序。性能略低于hashmap,但是在迭代访问时有较好的性能。

    Properties

    该类时hashtable的一个子类,相当于一个key value都是string类的Map。

    getProperty(String key)获取属性中的属性名对应的属性值。

    setProperty(String key,String Value)设置属性值。

    void load(inputStream inStream) 从属性文件中加载key-value对,把加载到的对加到propertes里。不报证顺序

    viud store(outputStream out,String comments)将properties中的键值对输出到指定属性文件。

    该类主要是处理属性文件。

    SortedMap接口和TreeMap接口

    与Sortedset和treeset规则一样。

    底层采用红黑树数据结构,每个key-value对应一个红黑树节点。对key排序。两种排序方法。自然排序,所有key必须实现comparable接口。定制排序,创建TreeMap时,传入一个Comparator对象。

    两个key通过compareTo方法返回0,如果使用自定义类作为key,则equals方法和compareto方法比较应该一致。

    WeakHashMap

    用法与hashmap基本一致。

    hashmap:key保留了对实际对象的强引用。只要hashmap对象不销毁,key所引用的对象也不回收,hashmap不会自动删除这些key对应的value。

    weakhashmap:只保留对key的弱引用。意味着如果weakhashmap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收。weakhashmap也可能自动删除这些key对应的key-value对。

    当垃圾回收了key对应的实际对象时,weakhashmap删除该key-value对。

    如果使用了weakhashmap,则不要使得key有强引用,否则失效。

    IdentityHashMap

    与HashMap用法一致。就是在判断key相等时比较严格。只有当key完全相等时,才判断key相等。也不保证顺序,和顺序不变。

    EnumMap

    1.创建EnumMap时必须显式制定一个枚举类,使用枚举类作为key

    2.在内部一个数组形式保存,所以非常紧凑高效。

    3.根据key的自然顺序也就是枚举类中的顺序保存key-value的对的顺序。

    4.不许使用null为key。

    各个Map实现类的性能

    HashMap比Hashtable快,因为后者古老并且线程安全。

    TreeMap比HashMap慢,因为采用红黑树保存key-value,但是优点是有顺序。一但填充之后,可以调用keyset获得key的set ,然后调用toarray生成key的数组,接下来使用arays的binarysearch方法在已排列的数组中快速的查询对象。

    一般使用Hashmap,需要顺序则使用TreeMap。

    LInkedHashmap比hashmap慢,因为要维护链表。identityhashmap没有特殊之处,只是使用==来判断key 相等。EnumMap性能最好,但是只用使用一个枚举类作为Key

    HashSet,HashMap的性能选项。

    hash表里存储元素的位置被称为“桶”,通常情况下一个元素一个桶。通过hash算法确定桶的存储位置。桶是open的,在发送hash冲突的时候,一个桶会放多个元素。这些元素以链表形式存储。

    hashMap和hashset一样,只是对应于key。

    容量:hash表中桶的数量,capacity

    初始化容量:创建表时桶的数量,都允许在构造器中初始化容量。

    尺寸:当前hash表中记录的数据。

    负载因子:size/capacity,负载因子为0,hash表为空,负载因子为0.5,hash表为半满表。

    hash表有一个极限负载。是0-1的一个数值,当达到极限负载时,hash表会成倍自动增加容量。并重新分配。这叫rehashing。

    允许在构造器中指定极限负载。默认为0.75。

    这是一个折中,较高的极限负载,可以节省空间,但增加了查询数据的事件开销。而查询是最频繁的操作。

    较低的极限负载,使得查询效率提高,但是浪费了空间。

    如果知道要存储大量数据,可以初始化较大的容量。防止发生rehashing,当要考虑,设置较大的容量,浪费内存空间。

  • 相关阅读:
    VueH5页面中input控件placeholder提示字默认颜色修改与禁用时默认字体颜色修改
    Vue页面内公共的多类型附件图片上传区域并适用折叠面板
    怎么通过CSS选择器采集网页数据
    web端生成pdf
    echart基础地图写法
    常用软件工具收藏
    iframe嵌套页面访问被拒绝
    使用httpserver开启一个本地服务器
    npm 的 unsafeperm 参数是有何作用呢?
    微信模板通知内容换行显示 Bing
  • 原文地址:https://www.cnblogs.com/tomato190/p/12379984.html
Copyright © 2011-2022 走看看