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,当要考虑,设置较大的容量,浪费内存空间。

posted @ 2020-02-28 20:30  小甲点点  阅读(116)  评论(0编辑  收藏  举报