Map和set的使用----Map

 

2.1 概念及场景
Map set 是一种专门用来 进行搜索 的容器或者数据结构,其搜索的效率与其具体的实例化子类有关 。以前常见的 搜索方式有:
1. 直接遍历,时间复杂度为 O(N) ,元素如果比较多效率会非常慢
2. 二分查找,时间复杂度为 log N ,但搜索前必须要求序列是有序的
上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:
1. 根据姓名查询考试成绩
2. 通讯录,即根据姓名查询联系方式
3. 不重复集合,即需要先搜索关键字是否已经在集合中
可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的 Map Set 是一种适合动态查找的集合容器。
2.2 模型
一般把搜索的数据称为关键字( Key ),和关键字对应的称为值(Value),将其称之为 Key-value 的键值对,所以 模型会有两种:
1. key 模型 ,比如:
有一个英文词典,快速查找一个单词是否在词典中
快速查找某个名字在不在通讯录中
2. Key-Value 模型 ,比如:
统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数: < 单词,单词出现的次数 >
梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号
Map 中存储的就是 key-value 的键值对, Set 中只存储了 Key
3.1 关于 Map 的说明
Map 是一个接口类,该类没有继承自 Collection ,该类中存储的是 <K,V> 结构的键值对,并且 K 一定是唯一的,不 能重复

3.3 Map 的常用方法说明

 1

在 Java 中,一个类可以向上转型为一个接口。这是因为接口是一种抽象的类型,它定义了一组方法的契约,而类可以实现(implement)这个接口并提供相应的方法实现。

当一个类实现了一个接口时,它可以被视为该接口的一种类型。这意味着你可以将该类的实例赋给接口类型的变量,从而实现类向接口的向上转型。这样做的好处是,你可以通过接口类型引用对象,调用接口中定义的方法,而不依赖于具体的类实现。

public class Test {
    public static void main(String[] args) {
        Map<String, Integer> map = new TreeMap<>();
        // 相当于往搜索树当中,插入数据 他是和key比较的
        map.put("hello",2);
        map.put("ab",3);
    }
}

 

2

public class Test {
    public static void main(String[] args) {
        Map<String, Integer> map = new TreeMap<>();
        map.put("hello",2);
        map.put("ab",3);

        System.out.println(map.get("ab"));
        System.out.println(map.getOrDefault("abcd",9999));
        System.out.println(map.getOrDefault("ab",9999));
    }
}

 3

public class Test {
    public static void main(String[] args) {
        Map<String, Integer> map = new TreeMap<>();
        map.put("hello",2);
        map.put("ab",3);

        System.out.println(map.get("ab"));
        System.out.println(map.getOrDefault("abcd",9999));
        System.out.println(map.getOrDefault("ab",9999));

        map.remove("ab");
        System.out.println("z");
    }
}

 4.

public class Test {
    public static void main(String[] args) {
        Map<String, Integer> map = new TreeMap<>();
        map.put("hello",2);
        map.put("ab",3);
        map.put("abcd",4);
        map.put("abcdf",5);
        map.put("abcdfg",6);

        Set<String> set = map.keySet();
    }
}

 5.  Set<Map.Entry<K, V>>  entrySet()

Map接口中有一个Entry嵌套接口 ,使用Map.Entry<K,v>调用

但嵌套接口目前还不能直接实例化对象,因为它只是一个接口定义,需要通过实现(接口的)类来创建实际的对象。

 TreeMap类实现了Map接口, TreeMap类中内部类Entry<k,v>实现了Map接口中的内部接口Map.Entry<k,v>. 

向上转型为Map<k,v>后,继续使用Map.Entry<K,v> 但接口内容是Entry<k,v>中的

类似于二叉树的TreeNode node 

public class Test {
    public static void main(String[] args) {
        Map<String, Integer> map = new TreeMap<>();
        map.put("hello",2);
        map.put("ab",3);
        map.put("abcd",4);
        map.put("abcdf",5);
        map.put("abcdfg",6);

        Set<String> set = map.keySet();
        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        System.out.println(entrySet);
    }
}

注意:

1. Map 是一个接口,不能直接实例化对象 ,如果 要实例化对象只能实例化其实现类 TreeMap 或者 HashMap 
2. Map 中存放键值对的 Key 是唯一的, value 是可以重复的(输入相同Key  后输入的key:value 作为更新)
3. TreeMap 中插入键值对时, key 不能为空(因为要通过比较key决定插入),否则就会抛 NullPointerException 异常 value 可以为空。但是HashMap key value 都可以为空。
4. Map 中的 Key 可以全部分离出来,存储到 Set 来进行访问 ( 因为 Key 不能重复 )
5. Map 中的 value 可以全部分离出来,存储在 Collection 的任何一个子集合中 (value 可能有重复 )
6. Map 中键值对的 Key 不能直接修改, value 可以修改,如果要修改 key ,只能先将该 key 删除掉,然后再来进行重新插入。
7. TreeMap HashMap 的区别  、

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值