映射
java类库为映射提供了两个通用的实现HashMap,TreeMap。


如果不要求有序,则使用HashMap能稍快。
- HashMap可以存放null的键和值
- 如果查询一个不存在的键则返回null
- 键是唯一的,如果对同一个键写入俩次,第二次会覆盖第一次的值
更新映射项
map.put(key,newValue);
map.putIfAbsent(key,value);//不存在则添加
//如果key不存在,则将key与1关联,否则将1和原值组合(此处是相加)
map.merge(key,1,Integer::sum);
还有一些更新方法不常用此处不列出
映射存在三种视图,键集、值集、键值对集。
Set<k> keySet()
Collection<v> values();
Set<Map.Entry<k,v> entrySet();
会返回对应的视图。
遍历HashMap的几种方法,假设HashMap<String,Integer> map;
Set<String> keySet;//第一种利用键集
for(String s : keySet) values = map.get(s);
for(Map.Entry<String,Integer> entry : map.entry()){//第二种利用键值对集合
String s = entry.getKey();
value v = entry.getValue(s);
}
//第三种,lamda表达式+foreach语法,最高效
map.forEach((String,Integer) -> {
do something to k,v
});
特殊的映射
WeakHashMap
设计和使用它是为了解决一个问题。如果一个值对应的键已经消亡了,那么这个键值对将无法从映射中删除。垃圾回收器为什么不能回收它呢?因为垃圾回收器跟踪的是活动的对象,而映射对象是活动的,那么其中所有的桶也是活动的,不能被回收。
使用weakhashmap时,当键的唯一引用来自散列条目时,散列协同垃圾回收器处理键值对。
首先WeakHashMap使用弱引用(weak references)保存键,弱引用对象将引用保存在散链表中。如果垃圾回收器发现某个对象只能由WeakReference引用,垃圾回收器就回收它,但是先要把它放到一个队列中。之后映射周期性检查队列,将map中对应得条目删除。
LinkedHashSet和LinkedHashMap
可以记住插入元素的顺序。这样表面看起来时随机排序,当条目插到表中时,就会并入到双向链表中。
1752

被折叠的 条评论
为什么被折叠?



