HashMap:数组方式存储key/value,线程非安全,允许null作为key和value,key不可以重复,value允许重复,不保证元素迭代顺序是按照插入时的顺序,要求key必须重写equals和hashcode方法。
TreeMap:基于红黑二叉树实现,线程非安全,不允许null,key不可以重复,value允许重复,存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口,会按照排序后的顺序迭代元素,默认升序,两个相比较的key不得抛出classCastException。主要用于存入元素的时候对元素进行自动排序,迭代输出的时候就按排序顺序输出。
上面的是基本区别,想要深入研究的话起码要个上万字,没必要细看,用的时候根据需求选择就行,这里主要说一下两个类的特有方法。
HashMap:
注意: 一般初始化形式是HashMap<String, Integer>,里边的String就是Key(K),里边的Integer就是Value(V)
下面基本都是实例方法,静态方法前边会加static
1. 存入键值对
V put ( K key, V value )
这里的返回值很神奇,向map中添加键值对后,返回这个key对应以前的value,如果以前没有则返回null
V putIfAbsent (K key, V value)
这个就有点意思了,他在输入键值对前,会先判断map中是否有相同key,如果有就不覆盖,返回原有的value,如果没有就返回null,并直接存入。
举个例子
hashMap.putIfAbsent("A",16); hashMap.putIfAbsent("A",17);
hashMap.putIfAbsent("B", 100); hashMap.putIfAbsent("B", 150);
hashMap.put("C", 222); hashMap.put("C", 23);
输出:A=16, B=100, C=23
void putAll ( Map<? extends K,? extends V> m)
很简单,就是把一个其他map复制过来
2. 通过键取值
V get(K key)
很简单,如果map有key则获取value,没有则返回null,也有可能有key但对应的value就是null,所以不能用get判断是否存在某个key。
V getOrDefault(K key, V defaultValue)
和上边差不多,如果map有key则获取value,没有则返回自定义的defaultValue
3. 键或值是否存在
boolean containsValue(Object value)
boolean containsKey(Object key)
4. 替换键值对
V replace(K key, V Value)
如果map中存在key则将其对应的value替换为参数里的value,并返回以前的value,如果不存在key则返回null。
boolean replace(K key, V oldValue, V newValue)
匹配map中对应的键值对,如果完全符合就替换,不符合就返回false。
void replaceAll(BiFunction function)
对所有键值对进行替换,函数式编程以后会另开文章讲解
5. 删除键值对
V remove(K key)
通过key删除键值对,返回key对应的value,如果不存在key返回null
boolean remove(K key, V Value)
只有完全匹配参数中的键值对才删除。
6. 元素数据处理(函数式编程)
V computeIfPresent(K key, BiFunctionsuper K, ? super V, ? extends V> remappingFunction)
V computeIfAbsent (K key, Functionsuper K, ? extends V> mappingFunction)
V compute (K key, BiFunctionsuper K, ? super V, ? extends V> remappingFunction)
V merge(K key, V value,BiFunction remappingFunction)
//上面这些功能简单来说就是 用自定义方法更新key对应的value。
void forEach ( BiConsumer action)
//这个更好理解了,就是对map所有键值对进行操作
7. 获取 键/值 的集合
Collection<V> values()
获取map中的所有value,并存入Collection
Set<K> keySet()
获取map中的所有key,存入set
Set<Map.Entry<K,V>> entrySet()
获取map中所有键值对,存入set,注意这里的返回类型是个map特有的接口Map.Entry的set集合,一个Map.Entry接口对应map中的一个键值对,Map.Entry是个静态接口,可以通过foreach或迭代器,调用每个接口的set/get方法,其实Map.Entry可以看作键值对的实体类
TreeMap:
注意:treemap的方法是在hashmap的基础上进行补充的,下面介绍的是treemap里的特有方法,至于基础方法和hashmap一模一样,只是没有compute和merge。
1. 查找限定范围内的 一个 key或entry
注意:之所以会有这些方法,是因为treemap是有序的。
Map.Entry<K,V> ceilingEntry(K key)
K ceilingKey(K key)
//查找大于等于参数key的map里包含的最小key或entry,没有就返回null
Map.Entry<K,V> floorEntry(K key)
K floorKey(K key)
//查找小于等于参数key的map里包含的最大key或entry,没有就返回null
Map.Entry<K,V> lowerEntry(K key)
K lowerKey(K key)
//查找小于参数key的map里包含的最大key或entry,没有就返回null
Map.Entry<K,V> higherEntry(K key)
K higherKey(K key)
//查找大于参数key的map里包含的最小key或entry,没有就返回null
Map.Entry<K,V> firstEntry(K key)
K firstKey(K key)
//查找map中最小的键(第一个)
Map.Entry<K,V> lastEntry(K key)
K lastKey(K key)
//查找map中最大的键(最后一个)
2 .获取treemap 的子集或 变种
NavigableMap<K,V> headMap(K toKey, boolean inclusive)
// 从>=min开始到<?tokey,截取这一范围的子map,如果inclusive=false,就是<tokey,如果inclusive=true,就是<=tokey,我们也可以不选择inclusive这个参数,它默认false。
NavigableMap<K,V> tailMap(K fromKey, boolean inclusive)
// 从>?formkey开始到<=max,截取这一范围的子map,如果inclusive=false,就是>tokey,如果inclusive=true,就是>=tokey,我们也可以不选择inclusive这个参数,它默认false。
NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
// 从>?formkey开始到<?tokey,截取这一范围的子map,如果inclusive=false,就是>/<,如果inclusive=true,就是>=/<=,我们也可以不选择inclusive这个参数,它默认false。
NavigableSet<K> descendingKeySet()
NavigableMap<K,V> descendingMap()
// 返回 反序 的key集合或map
3. 删除最大或最小键值对
Map.Entry<K,V> pollFirstEntry()
Map.Entry<K,V> pollLastEntry() //返回被删除的键值对