美文网首页
集合类(Set(单列)接口和Map(双列)接口)

集合类(Set(单列)接口和Map(双列)接口)

作者: 不小心丢了 | 来源:发表于2019-08-13 14:00 被阅读0次

    Set接口

    Set接口简介

    Set接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set接口中的元素无序,并且都会以某种规则保证存入的元素不重复出现。

    Set接口主要有两个实现类,分别是HashSetTreeSet。其中,HashSet根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。TreeSet则是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序

    HashSet集合

    HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当向HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法来计算对象的哈希值,从而确定元素的存储位置。如果此时哈希值相同,再调用对象的equals()方法来确保该位置没有重复的元素。Set集合与List集合存取的方式都一样。

    HashSet集合之所以能确保不出现重复的元素,是因为它在存入元素时做了很多工作。当调用HashSet集合的add()方法存入元素时,首先调用当前存入对象的hashCode()方法获得对象的哈希值,然后根据对象的哈希值计算出一个存储位置。如果该位置上没有元素,则直接将元素存入,如果该位置上有元素存在,则会调用equals()方法让当前存入的元素依次和该位置上的元素进行比较。如果返回的结果为false就将该元素存入集合,返回的结果为true则说明有重复元素,就将该元素舍弃。

    当向集合中存入元素时,为了保证HashSet正常工作,要求在存入对象时,重写Object类中的hashCode()和equals()方法。在上面的代码中将字符串存入HashSet时,String类已经重写了hashCode()和equals()方法。但是如果将Student对象存入HashSet,结果如何呢?

    向HashSet集合存入了三个Student对象,并将这三个对象迭代输出。运行结果中出现了两个相同的学生信息,这样的学生信息应该被视为重复元素,不允许同时存在HashSet集合中。之所以没有去掉是因为在定义Student类时没有重写hashcode()和equals()方法。接下来对Student类进行改写,假设id相同的学生就是同一个学生。

    Map接口

    Map接口简介

    在现实生活中,每个人都有唯一的身份证号,通过身份证号可以查询到这个人的个人信息,这两者是一对一的关系。在应用程序中,如果想存储这种具有对应关系的数据,则需要使用JDK中提供的Map接口

    Map接口是一种双列集合,它的每个元素都包含一个键对象Key值对象Value,键和值对象之间存在一种对应关系,称为映射。从Map集合访问元素时,只要指定了Key,就能找到对应的Value

    其中,put( Object key,Object value )和get(Object key)方法分别用于向Map中存入元素和取出元素;containsKey(Object key)和containsValus(Object value)方法分别用于判断Map中是否包含某个指定的键或值;keySet()和values()方法分别用于获取Map中所有的键和值。

    HashMap集合

    HashMap集合是Map接口的一个实现类,它用于存储键值映射关系,但必须保证不出现重复的键。

    前面已经介绍过Map集合中的键具有唯一性,现向Map集合存储一个相同的键看看会出现什么情况。对上面代码进行修改,增加一行代码map.put("3","Mary");

    可以看出,Map中仍然只有3个元素,只是第2次添加的值“Mary”覆盖了原来的值“Lucy”,这也证实了Map中的键必须是唯一的,不能重复,如果存储了相同的键,后存储的值会覆盖原有的值,简而言之就是键相同,值覆盖。

    在程序开发中,经常需要取出Map中所有的键和值,那么如何遍历Map中所有的键值对呢?有两种方式可以实现,第一种就是先遍历Map集合中所有的键,再根据键获取相应的值。

    先遍历Map集合中所有的键和值,再根据键获取相应的值的方式。首先调用Map对象的KeySet()方法,获得存储Map中所有键的Set集合,然后通过Iterator迭代Set集合的每一个元素,即每一个键,最后通过调用get(String key)方法,根据键获取相应的值。

    先获取集合中所有的映射关系,然后从映射关系中取出键和值。首先调用Map对象的entrySet()方法获得存储在Map中所有映射的Set集合,这个集合中存放了Map.Entry类型的元素(Entry是Map内部接口),每个Map.Entry对象代表Map中的一个键值对,然后迭代Set集合,获得每一个映射对象,并分别调用对象的getkey()和getValue()方法获取键和值。

    在Map中还提供了一个value()方法,通过这个方法可以直接获取Map中存储所有值的Collection集合。

    通过调用Map的values()方法获取包含Map中所有值的collection集合,然后迭代出集合中的每一个值。

    Java提供了LinkedHashMap类,它是HashMap的子类,与LinkedList一样,它也使用双向链表来维护内部元素的关系,使Map元素迭代的顺序与存入的顺序一致。

    相关文章

      网友评论

          本文标题:集合类(Set(单列)接口和Map(双列)接口)

          本文链接:https://www.haomeiwen.com/subject/jmqqjctx.html