Map和Set

1. Map(字典)

        Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值)都可以作为一个键或一个值。

        说明:Map是一个接口类,该类没有继承自Collection,该类中存储的是结构的键值对,并且K一定是唯一的不 能重复。

                                  Map和Set_第1张图片

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

1.1 Map底层结构

Map和Set_第2张图片

        HashMap:基于哈希表实现。

        TreeMap:基于红黑树实现,红黑树的本质就是一棵二叉查找树.

Map hashMap = new HashMap<>();
Map treeMap = new TreeMap<>();

2.Set(集合)

        Set 对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。

  简而言之,Set和Map类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key。

         Map和Set_第3张图片

注意:
  1.  Set是继承自Collection的一个接口类
  2.  Set中只存储了key,并且要求key一定要唯一
  3.   TreeSet的底层是使用Map来实现的,其使用keyObject的一个默认对象作为键值对插入到Map中的
  4.   Set最大的功能就是对集合中的元素进行去重
  5.   实现Set接口的常用类有TreeSetHashSet,还有一个LinkedHashSetLinkedHashSet是在HashSet的基础 上维护了一个双向链表来记录元素的插入次序。
  6.   Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入
  7.   TreeSet中不能插入nullkeyHashSet可以。

2.1 Set底层结构

Map和Set_第4张图片

3.Map和Set区别

        除了Set是继承自Collection的接口类,Set中只存储了Key,我们这里为大家总结一下它们的其他区别要点:

  • Map和Set查找速度都非常快,时间复杂度为O(1),而数组查找的时间复杂度为O(n)。
  • Map对象初始化的值为一个二维数组,Set对象初始化的值为一维数组。
  • Map对象和Set对象都不允许键重复(可以将Set对象的键想象成值)。
  • Map对象的键是不能改的,但是值能改,Set对象只能通过迭代器来更改值

你可能感兴趣的:(java,开发语言)