java中的Map和Set

目录

一.搜索树

1.查找

2.插入

3.删除

二、Map

1.Map.Entry

2.Map 的常用方法

三 、Set

1.Set中常用的方法


Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。

常见的搜索方式有:
1.直接遍历:时间复杂度为O(N),元素较多的时候效率会很慢

2.二分查找:时间复杂度为O(logN),但是搜索前要求数据是有序的

常见的几种搜索比较适合静态类型的查找,一般不会对数据进行增删查改,而对现实中的查找,多数是变动的. 比如:对手机通讯录的增加联系人,删除联系人,更改联系人的联系方式.对于这中查找,上述的搜索方式明显不太适用了.

而我们的Map和Set是一种适合动态查找的集合容器,有着明显的优势.


一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以 模型会有两种:

1.Key模型: 

比如:

  • 查找一个英文单词
  • 查找微信列表中某一个备注是否存在

2.Key-Value模型 :

  • 查找一个数据出现的次数
  • 一个分数表中某一个分数的人数有几个

对应到我们本文章要讲的Map和Set

Map存储的是Ket-Value的键值对,Set存储的是单纯的Key

我们可以这样理解,Set中不会出现重复的数据,当要插入是会查询这个数据是否存在,如果存在,就不会进行插入,Map的话,如果存在我们就可以直接修改Value的值

TreeMap 和 TreeSet 即 java 中利用搜索树实现的 Map 和 Set;实际上用的是红黑树,而红黑树是一棵近似平衡的 二叉搜索树,即在二叉搜索树的基础之上 + 颜色以及红黑树性质验证


所以接下来我们来了解一下搜索树

一.搜索树

二叉搜索树又称为二叉排序树,或者是一颗空树,或者是具有以下性质的树:

  • 若它的左子树不为空,则它左子树上所有的节点的值都小于根节点的值
  • 若它的右子树不为空,则它左子树上所有的节点的值都大于根节点的值
  • 它的左右子树也是一颗二叉搜索树

对于一颗搜索树它有几个关键操作:

1.查找

以上面的图为例子,我们要查找" 7 "这个值即 Key = 7 

  • 如果根节点不为空
  • 根节点的值 == Key return;
  • 如果根节点的值 < key 向右子树查找
  • 如果根节点的值 > key 向左树查找
  • 到新的根节点重复上述操作
  • 如果未找到即这个节点不存在

为了后续代码方便展示我们来搭好款框架:

  • 我们需要一个 val值
  • 一个left节点
  • 一个right节点
  • 还有一个头结点
  • 需要一个构造方法
public class BinarySearchTree {
    static class TreeNode {
        public int val;
        public TreeNode left;
        public TreeNode right;


        public TreeNode(int val) {
            this.val = val;
        }
    }
}
     public TreeNode root = null;

我们用java代码来实现这个简单的搜索操作:

        public boolean search(int val) {
            TreeNode cur = root;
            if (root == null) {
                return false;
            }
            while (cur != null) {
                if (cur.val == val) {
                    return true;
                } else if (cur.val > val) {
                    cur = cur.left;
                } else {
                    cur = cur.right;
                }
            }
//循环结束还没有返回true 即返回false;
 
            return false;
        }

数据是实现insert插入的数据:

我们查找 7 这个val:

    public static void main(String[] args) {
        BinarySearchTree bTree
Java中,也有类似于C++ STL中的mapset的容器。Java中的mapset都是基于接口实现,常用的实现类有HashMap、TreeMap、LinkedHashMap等。常用的set实现类有HashSet、TreeSet、LinkedHashSet等。 Map接口Set接口的主要区别在于,Map接口用于存储键值对,而Set接口用于存储不重复的元素。Map接口提供了put()、get()、remove()等方法,Set接口提供了add()、remove()、contains()等方法。 HashMap是一种基于哈希表实现的Map接口的实现类,它提供了快速的查找、插入删除操作,查找、插入删除操作的时间复杂度都为O(1)。HashMap中的值都可以为null,但HashMap不保证元素的有序性。如果需要按照元素的插入顺序访问元素,可以使用LinkedHashMap。 TreeMap是一种基于红黑树实现的Map接口的实现类,它保证了元素的有序性,元素按照键的自然顺序或比较器顺序进行排序。TreeMap的查找、插入删除操作的时间复杂度都为O(logN)。 HashSet是一种基于哈希表实现的Set接口的实现类,它提供了快速的查找、插入删除操作,查找、插入删除操作的时间复杂度都为O(1)。HashSet不保证元素的有序性,元素可以为null。 TreeSet是一种基于红黑树实现的Set接口的实现类,它保证了元素的有序性,元素按照自然顺序或比较器顺序进行排序。TreeSet的查找、插入删除操作的时间复杂度都为O(logN)。 LinkedHashSet是一种基于哈希表链表实现的Set接口的实现类,它保证了元素的插入顺序,同时提供了快速的查找、插入删除操作。LinkedHashSet的查找、插入删除操作的时间复杂度都为O(1)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值