编程语言
首页 > 编程语言> > Java集合(五)Map接口

Java集合(五)Map接口

作者:互联网

  在现实生活中,每个人都有唯一的身份证号,通过身份证号可以查询到这个人的信息,这两者是一对一的关系。在应用程序中,如果想存储这种具有对应关系的数据,则需要使用
Java 中提供的 Map 接口。
  Map 接口是一种双列集合,它的每个元素都包含一个键对象 Key 和值对象 Value,键和值对象之间存在一种对应关系,称为映射。Map 中的映射关系是一对一的,所以“键对象”不能重复。一个键对象Key 对应唯一一个值对象 Value,其中键对象Key 和值对象Value 可以是任意数据类型,并且键对象 Key 不允许重复,这样在访问 Map 集合中的元素时,只要指定了 Key,就能找到对应的Value。

  Map接口实现类有HashMap,TreeMap,HashTable,Properties等  

  Map接口定义的常用方法:

 

HashMap集合

  HashMap 集合是Map 接口的一个实现类,它用于存储键值映射关系,该集合的键和值允许为空,但键不能重复,且集合中的元素是无序的。HashMap 底层是由哈希表结构组成的,其实就是“数组十链表”的组合体,数组是 HashMap 的主体结构,链表则主要是为了解决哈希值冲突而存在的分支结构。正因为这样特殊的存储结构,HashMap 集合对于元素的增、删、改、查操作表现出的效率都比较高。接下来,通过一张图来展示 HashMap 集合底层实现,如下图所示在图所示结构中,水平方向以数组结构为主体并在竖直方向以链表结构进行结合的就是 HashMap 中的哈希表结构。在哈希表结构中,水平方向数组的长度称为 HashMap集合的容量(capacity),竖直方向每个元素位置对应的链表结构称为一个桶(bucket),每个桶的位置在集合中都有对应的桶值,用于快速定位集合元素添加、查找时的位置。图中,在展示 HashMap 集合内部哈希表结构的基础上,也展示了存储元素的原理。

 

  当向 HashMap 集合添加元素时,首先会调用键对象k的hash(k)方法,快速定位并寻上到该元素在集合中要存储的位置。在定位到存储元素键对象k的哈希值所对应桶位置后,会出现两种情况:第一种情况,键对象k的hash 值所在桶位置为空,则可以直接向该桶位置插人元素对象;第二种情况,键对象k的 hash 值所在桶位置不为空,则还需要继续通过键对象上的equals(k)方法比较新插人的元素键对象k和已存在的元素键对象上是否相同,如果键对象k相同,就会对原有元素的值对象v进行替换并返回原来的旧值,否则会在该桶的链表结构头部新增一个节点来插入新的元素对象。

 

 举例如下:

 下面我们自己定义了一个employee类,往map中添加,构造器,get,set方法,toString方法:

 

  

 

在上面介绍HashMap 集合时,已经说明HashMap 集合并不保证集合元素存入和取出的顺序。如果想让这两个顺序一致,可以使用 Java 中提供的 LinkedHashMap 类,它是HashMap的子类,和 LinkedList一样也使用双向链表来维护内部元素的关系,使LinkedHashMap 元素选代的顺序与存入的顺序一致,接下来通过一个案例来学习下LinkedHashMap 的用法,如下图

 

 

 

 

TreeMap集合

  TreeMap也是Map接口的实现类,它也是用来存储键值映射关系的,并不允许出现重复的键。TreeMap是红黑二叉树的典型实现,来保证键的唯一性,这与TreeSet集合存储原理一样,因此TreeMap中所有的键都是按照某种顺序排列的。TreeMap和HashMap实现了同样的接口Map,因此,用法对于调用来说没有区别。HashMap效率高于TreeMap,在需要排序时才选TreeMap。

举例如下 :

 

   可以看到,我们按220,3,6的顺序put值进入tm1,但是取出就是按照键递增的方式输出,这是因为添加的元素中键对象是Integer类型,Integer类型实现了Comparable接口,因此默认会按照自然顺序对元素排序。

  如果我的键是自定义的,那怎么排序呢,我们可以自己继承Comparable接口实现自定义排序:

举例如下,我们自定义一个类实现comparable接口:

 

 

 我们先通过薪水salary比较,如果薪水一样,我们再通过id比较,具体方式和输出结果如上图。

  当然我们也可以自定义比较器Comparatble进行排序。

 

 

 HashTable集合

  HashTable类和HashMap用法几乎一样,底层实现几乎一样,只不过HashTable的方法添加了synchronized关键字确保线程同步检查,效率较低。

  HashMap与HashTable区别:

1.HashMap:线程不安全,效率高。允许key或value为null

2.HashTable:线程不安全,效率低。不允许key或value为null。

 

Properties集合

。。。。

标签:Map,Java,HashMap,对象,元素,TreeMap,接口,集合
来源: https://www.cnblogs.com/zhulei118/p/16359776.html