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