Map集合(HashMap、TreeMap)

一、Map集合

1.概述

Map是一个接口。Map用于保存具有映射关系的数据,每个Entry都有key-value两个对象,value可以重复,key不可重复。Map可以有多个value为null,只能有一个key为null。也叫做哈希表、散列表。

2.特点

  1. Map可以根据键来提取对应的值
  2. Map的键不允许重复,如果重复,对应的值会被覆盖
  3. Map存放的都是无序的数据
  4. Map的初始容量是16,默认的加载因子是0.75

TIPS:源码摘抄:
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
初始容量1<<4,相当于1*(2^4),也就是16
static final float DEFAULT_LOAD_FACTOR = 0.75f;
默认的加载因子是0.75f,也就是存到75%开始扩容,按照2的次幂进行扩容

3.继承结构

 4.Map常用方法测试及迭代方式

package cn.tedu.list;

import java.util.*;

/**本类用于测试Map接口*/
public class TestMap {
    public static void main(String[] args) {
        //1.创建Map对象
        /**Map中的数据要符合映射规则,一定注意要同时指定K和V的数据类型
         * 至于这个K和V具体要指定成什么类型,取决于具体的业务需求*/
        Map<Integer,String> map = new HashMap<>();//注意导包:java.util
        //2.向map集合存入数据,注意方法是put(),并且需要存入一对<K,V>的值
        map.put(9527,"白骨精");
        map.put(9528,"黑熊精");
        map.put(9529,"鲤鱼精");
        map.put(9530,"黄毛怪");
        map.put(9531,"黑熊精");
        map.put(9527,"女儿国国王");
        /**1.map中存放着的都是无序的数据
         * 2.map中的value可以重复-比如我们可以存两个黑熊精
         * 3.map中的key不允许重复,如果重复,后面的value会把前面的value覆盖掉
         * 比如女儿国国王和白骨精都是9527,白骨精就被覆盖掉了*/
        System.out.println(map);//查看map集合中的数据是否存入成功

        //3.进行方法测试
        //map.clear();//清空集合
        System.out.println(map.hashCode());//获取集合的哈希码
        System.out.println(map.equals("黄毛怪"));//判断“黄毛怪”是否与集合对象相等
        System.out.println(map.isEmpty());//判断集合是否为空
        System.out.println(map.size());//获取集合中元素的个数

        //判断当前map集合中是否包含指定的Key键
        System.out.println(map.containsKey(9527));//true
        //判断当前map集合中是否包含指定的Value
        System.out.println(map.containsValue("白骨精"));//false,因为已被覆盖
        //根据key值获取到对应的value值
        System.out.println(map.get(9530));
        //根据此key值对应的键值对,K与V都删了
        System.out.println(map.remove(9529));
        System.out.println(map.containsKey(9529));
        System.out.println(map.containsValue("鲤鱼精"));

        //将map集合中的所有value取出,放入Collection集合中
        //Collection<Type>中Type的类型,取决于map中value的类型
        Collection<String> values = map.values();
        System.out.println(values);//[女儿国国王, 黑熊精, 黄毛怪, 黑熊精]

        //4.map集合的迭代方式一
        /**方式一:
         * 遍历map中的数据,但是map本身没有迭代器,所以需要先转换成set集合
         * Set<Key>:把map中的所有key值存入到set集合当中--keySet()*/
        //4.1将map集合中的key值取出存入set集合中,集合的泛型就是key的类型Integer
        Set<Integer> keySet = map.keySet();
        //4.2想要遍历集合就需要获取集合的迭代器
        Iterator<Integer> it = keySet.iterator();
        //4.3循环迭代集合中的所有元素
        while(it.hasNext()){//判断是否有下一个元素可以迭代
            Integer key = it.next();//拿到本轮循环中获取到的map的key
            String value = map.get(key);
            System.out.println("{"+key+","+value+"}");
        }

        /**方式二:
         * 遍历map集合,需要把map集合先转成set集合
         * 是把map中的一对键值对key&value作为一个Entry<K,V>整体放入set
         * 一对K,V就是一个Entry*/
        Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
        //获取迭代器
        Iterator<Map.Entry<Integer, String>> it2 = entrySet.iterator();
        while(it2.hasNext()){//判断是否有下一个元素可迭代
            //本轮遍历到的一个Entry对象
            Map.Entry<Integer, String> entry = it2.next();
            Integer key = entry.getKey();//获取Entry中的key
            String value = entry.getValue();//获取Entry中的value
            System.out.println("{"+key+","+value+"}");
        }
    }
}

 二、HashMap

 1.概述

HashMap底层是一个Entry[ ]数组,当存放数据时,会根据hash算法来计算数据的存放位置
算法:hash(key)%n , n就是数组的长度,其实也就是集合的容量
当计算的位置没有数据的时候,会直接存放数据
当计算的位置,有数据时,会发生hash冲突/hash碰撞,解决的办法就是采用链表的结构,在数组中指定位置处已有元素之后插入新的元素,也就是说数组中的元素都是最早加入的节点

 2.特点

1.HashMap的键要同时重写hashCode()和equlas()
hashCode()用来判定二者的hash值是否相同,重写后根据属性生成
equlas()用来判断属性的值是否相同,重写后,根据属性判断
–equlas()判断数据如果相等,hashCode()必须相同
–equlas()判断数据如果不等,hashCode()尽量不同

2.HashMap允许空键值

3.HashMap是无序的,非线程安全

4.HashMap实际上是一个“数组+链表+红黑树”的数据结构

三、TreeMap

 1、TreeMap是一个有序的key-value集合,它内部是通过红-黑树实现的,它支持序列化 。
 2、TreeMap的存储结构是按照红-黑树存储的,每个key-value对也存储在一个Entry里,只不过这个Entry和前面HashMap或者HashTable中的Entry不同,TreeMap的Entry其实是红-黑树的一个节点。
3、TreeMap的遍历方式一般分为两步:
     1). 先通过entrySet()或keySet()或value()方法获得相应的集合;
     2). 通过Iterator迭代器遍历上面得到的集合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值