JAVA基础(七)-Map篇

一、map实现类

接口类java.util.Map有四个实现类:HashMap、Hashtable、LinkedHashMap、TreeMap

HashMap:最常用,遍历时随机

Hashtable:相较HashMap:键值均不能为null(编译时不会报错);线程安全,多线程可共用一个Hashtable

LinkedHashMap:键按插入顺序排序,遇到需按插入顺序遍历时可用

TreeMap:红黑树算法,键按升序排序,遇到需按键大小顺序遍历时可用。因此key的类型需要实现Comparable接口重写int compareTo(Object arg0)方法来保证能排序

此外com.google.common.collect.HashMultimap<K, V>实现了键可重复的Map,前面四种若插入时遇到重复键则后面的键值对会覆盖前面的键值对

 

二、初始化

以HashMap为例

1、静态初始化

Map<String, Object> map = new HashMap<String, Object>(){

     {
                      put("key1", "value1");
                      put("key2", "value2");
                  }

};

注:此时HashMap的泛型类型不能缺省;效率比动态初始化低

2、动态初始化

Map<String, Object> map = new HashMap<>(); // 然后再put赋值

3、初始化常量Map

利用java.util.Collections的Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m)方法

class FinalMap {
                    private static final Map<String, Object> map;
                    static {
                        Map<String, Object> mapTemp = new HashMap<String, Object>() {
                            {
                                put("key1", "value1");
                                put("key2", "value2");
                            }
                        };
                        map = Collections.unmodifiableMap(mapTemp);
                    }
                }

 

三、遍历

java.util.Map接口中有一些方法可用于遍历

1、遍历键

调用Set<K> keySet(); 遍历Set

2、遍历值

调用Collection<V> values();遍历Collection

3、遍历键和值

调用Set<Map.Entry<K, V>> entrySet();遍历Set。在java.util.Map.Entry<K, V>接口中,有K getKey();和V getValue();两个方法可以分别获取键和值

 

四、是否包含某个键或值

java.util.Map接口中有boolean containsKey(Object key);和boolean containsValue(Object value);方法

 

五、判断两个map的键值对是否相等

实现类对象调用实现了的java.util.Map接口的equals方法,甚至譬如HashMap和Hashtable的对象间也可做此判断

 

六、删除某个键值对

 java.util.Map接口中的V remove(Object key);、boolean remove(Object key, Object value) 网上有文章论述说多线程时删除失败,这里采用迭代器的方式进行删除

上述的Set<K> keySet();方法获得键的Set后调用Set的Iterator<E> iterator();方法获得其迭代器,通过遍历迭代器的方式调用迭代器的void remove();方法进行移除

并且那篇文章说遍历的时候新增键值对会有同样的并发问题,建议也用迭代器新增。但是个人目前未发现该种新增的方法,毕竟Iterator不像ListIterator一样有add方法

 

七、自定义排序map

用List<Map.Entry<K, V>>存储map.entrySet(),以ArrayList为例,利用public ArrayList(Collection<? extends E> c)这个构造方法可以将Set类型转为List,然后利用java.util.Collections的void sort(List<T> list, Comparator<? super T> c)方法自定义比较器来将Map.Entry<K, V>排序

 

 

参考文章列表:

https://blog.csdn.net/i_peter/article/details/51004023

https://blog.csdn.net/liuxiao723846/article/details/50454622

http://www.cnblogs.com/zuge/p/5977123.html

https://blog.csdn.net/xzw_123/article/details/50239743

https://blog.csdn.net/fg2006/article/details/6411200

https://www.cnblogs.com/bukudekong/p/3889740.html

https://blog.csdn.net/we_shell/article/details/46344343?ref=myread

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值