Java集合基础_Map体系(HashMap、HashTable等)


Map是一种键值对形式的数据结构

Map<K,V>

  • K代表key
  • V代表value

Map键值对的规定:

  • 我们可以通过key的值来获得相应的值

  • 一个映射不能包含重复的键(key)

  • 每个键最多只能映射到一个值

  • 键只允许有一个空值,(键不重复),值可以有多个空值。

  • 无序

Map接口API

Map是接口,使用子类hashmap来实现map提供的方法

        Map<String,String>  map  = new HashMap<>()  ;
        map.put("白日鼠","白胜");
        map.put("豹子头","林冲") ;
        map.put("小诸葛","富安") ;
        System.out.println(map);
结果:
{豹子头=林冲, 白日鼠=白胜, 小诸葛=富安}

若插入已存在的键,值会被覆盖

        map.put("小诸葛","AA") ;
        System.out.println(map);
结果:{豹子头=林冲, 白日鼠=白胜, 小诸葛=AA}

插入空键:

        map.put(null,"BB");
        System.out.println(map);
{null=BB, 豹子头=林冲, 白日鼠=白胜, 小诸葛=AAA}

HashMap

HashMap是map的最常用的实现类

特点:

  • key只能支持一个null, 值不做限制
  • 线程不安全,如想使用线程安全的HashMap,可以考虑ConcurrentedHashMap,或HashTable或Collections.synchronizedMap(map)(该方法会对map里每个方法都加上synchronized关键字);

==

  • putAll:

在map集合中加入另一个map集合

        map.putAll(map1);
        System.out.println(map);
结果:{null=BB, 智多星=吴用, 入云龙=公孙胜, 豹子头=林冲, 白日鼠=白胜, 小诸葛=AA}
  • remove(key)

通过键移除指定键值

        map.remove("小诸葛") ;
        System.out.println(map);
  • get(key)

获得指定键的值

        String value = map.get("豹子头");
        System.out.println(value);
结果:林冲
  • keySet

获得map中的所有键,返回的是集合,用set引用接收即可

        Set<String> maps = map.keySet();
        System.out.println(maps);
结果:[null, 智多星, 入云龙, 豹子头, 白日鼠]
  • 遍历:
        for (String key :maps){
            value = map.get(key) ;
            System.out.println(key+"->"+value);
        }

结果:
null->BB
智多星->吴用
入云龙->公孙胜
豹子头->林冲
白日鼠->白胜
  • containsKey:判断是否含有相关键
        boolean isCon = map.containsKey("豹子头");
        System.out.println(isCon);
true
  • containsValue:判断是否含有相关值
        isCon = map.containsValue("白胜") ;
        System.out.println(isCon);
结果:true
  • isEmpty:判断是否空
        boolean isE = map.isEmpty() ;
        System.out.println(isE);
false

TreeMap

该映射根据其键的自然顺序进行排序(Int),或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法

特点:

  • 可以按照key来自定义排序
  • 因为要支持排序,key不能为null且重复
  • 线程不安全

HashTable

  • 不允许任何null键值(安全集合)
  • 无序
  • 线程安全(通过在每个方法上添加synchronized)

HashTable

HashTable和HashMap的区别

  • HashMap线程不安全,HashTable线程安全

  • Hashtable中,key和value都不允许出现null值,否则会抛出NullPointerException异常

    • 由于null不是对象,因此无法在其上调用.equals()或.hashCode(),因此Hashtable无法计算哈希以将其用作键,而HashMap专门针对null的情况做了处理
  • HashTable直接使用对象的hashCode,而HashMap重新计算hash值,利用扰动函数使得散落更加均匀,减少Hash碰撞概率

    •     return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
      
  • 两者都通过( n - 1) & hash 判断当前元素存放的位置

LinkedHashMap

  • 使用链表将key串在一起
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值