当前位置 : 主页 > 编程语言 > java >

64 java集合和泛型_14 _HashMap、HashSet、TreeMap、TreeSet判断元素相同

来源:互联网 收集:自由互联 发布时间:2022-07-13
文章目录 ​​HashMap(键值对)​​ ​​HashSet​​ ​​TreeMap(键值对)​​ ​​TreeSet​​ HashMap(键值对) HashMap 存放元素时,是key-value这样的组合时,在存放元素时,如果原本已经


文章目录

  • ​​HashMap(键值对)​​
  • ​​HashSet​​
  • ​​TreeMap(键值对)​​
  • ​​TreeSet​​

HashMap(键值对)

  • HashMap 存放元素时,是key-value这样的组合时,在存放元素时,如果原本已经存在对应的key,则直接改变对应的value,并返回旧的value,而在判断key是否存在(相等)的时候是先比较key的hashCode,再比较相等(==)或equals的。
  • HashMap中判断元素是否相同主要有两个方法,一个是判断key是否相同,一个是判断value是否相同:
    • HashMap是怎样判断元素Key是否相同的,就是先判断key的hashCode是否相同,再判断key是否相等(==)或equals的(Map中判断key是否相同是通过containsKey()方法进行的,有兴趣可以去看源码)
    • 判断value是否相同的,对于非null形式的value是通过value的equals来进行判断的,而null形式的只要相等即可,即保存的元素中有value为null即可

    HashSet

  • HashSet中的元素其实是通过HashMap来保存的,
  • 在每个HashSet对象中都持有一个对应的HashMap对象的引用,在对HashSet进行元素的添加、删除等操作时都是通过其持有的HashMap来进行的。
  • 在保存元素时其会将对应的元素作为持有的HashMap的key来进行保存,对应的value是一个常量Object,所以其在保存的时候判断元素是否相同所使用的是HashMap判断key是否相同的逻辑。(判断是否包含某一元素时也是调用了所持有的HashMap的containsKey方法来进行判断的)
  • TreeMap(键值对)

  • TreeMap中存放的元素都是有序的,而且是根据key进行排序的。
  • TreeMap在对存放的元素进行排序时有两种方式:
    • 一种是通过自身持有的Comparator进行排序
    • 另一种是通过实现了Comparable接口的key进行排序,优先使用第一种方式,当持有的Comparator(默认为null)为null时则采用第二种方式。
  • 第一个元素将直接存进去。之后的元素分两种情况进行,一种是根据Comparator来比较,另一种是根据Comparable来比较
  • 比较了现有元素的key与当前存放元素的key的结果为0(重复)时,将认为当前存放的元素key在原有Map中已经存在,然后改变原有的key对应的value为新value,而不再新存入key-value对,然后就直接返回了旧value。
  • TreeMap判断元素是否存在的逻辑是通过判断Comparator或Comparable进行比较后的结果是否为0,所以我们在使用TreeMap希望实现某种类似于元素equals的逻辑时要特别小心。
  • TreeMap的containsValue的逻辑还是判断的对应的value是否equals,与HashMap类似,(有兴趣可以去看源码)
  • TreeSet

  • TreeSet是的Set的一种实现,其存放的元素是不重复的,而且是有序的
  • 默认情况下所存放的元素必须实现Comparable接口,因为默认情况下将把元素当做Comparable对象进行比较。
  • TreeSet也是可以通过Comparator来比较其中存放的元素的,这可以在构造TreeSet的时候通过传入一个Comparator对象或一个持有Comparator对象的TreeMap来实现。
  • TreeSet的实现与HashSet的实现类似,其内部也持有了一个Map的引用,只不过它引用的不是HashMap,而是TreeMap。
  • TreeSet中元素的新增、删除等操作都是由其持有的TreeMap来实现的,所以与HashSet类似,TreeSet中判断元素是否相同的方式与TreeMap是一致的,也是通过Comparator或Comparable来判定的,而不是传统的equals方法。(有兴趣可以去看源码)

  • 网友评论