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

HashMap(键值对)

  1. HashMap 存放元素时,是key-value这样的组合时,在存放元素时,如果原本已经存在对应的key,则直接改变对应的value,并返回旧的value,而在判断key是否存在(相等)的时候是先比较key的hashCode,再比较相等(==)或equals的。

  2. HashMap中判断元素是否相同主要有两个方法,一个是判断key是否相同,一个是判断value是否相同:

    • HashMap是怎样判断元素Key是否相同的,就是先判断key的hashCode是否相同,再判断key是否相等(==)或equals的(Map中判断key是否相同是通过containsKey()方法进行的,有兴趣可以去看源码)
    • 判断value是否相同的,对于非null形式的value是通过value的equals来进行判断的,而null形式的只要相等即可,即保存的元素中有value为null即可

HashSet

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

TreeMap(键值对)

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

TreeSet

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悬浮海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值