架构师数据结构技术Day03-集合之Set

Posted 攻城狮Chova

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了架构师数据结构技术Day03-集合之Set相关的知识,希望对你有一定的参考价值。

Set

  • Set: 具有元素唯一性.该集合可以知道某个元素是否已经存在于集合中 ,Set中不会存在重复元素
  • Set用于存储不重复的无序元素 ,Set集合中的元素存入和取出的顺序不一定相同

对象相等

  • 引用到堆上同一个对象的两个引用是相等的:
    • 如果对两个引用调用hashCode() 方法,会得到相同的结果
    • 如果对象所属的类没有重写ObjecthashCode() 方法,那么hashCode() 方法会返回每个对象特有的hashCode值.这两个对象的hashCode值是不相等的
  • 要使得两个不同的对象相等:
    • 要重写Object中的hashCode() 方法和equals() 方法
    • 因为Object中的hashCode() 方法返回的对象的内存地址,所以必须重写hashCode() 方法才能保证两个不同的对象具有相同的hashCode值,同时也需要两个不同的对象调用equals方法返回true

HashSet

  • Hash表中存放的是哈希值hashcode
    • HashSet中存储的元素是无序的
    • HashSet存储元素的顺序不是按照存入时的顺序而是按照hashcode的顺序存储元素的
    • 所以读取元素也是按照hashcode顺序
  • HashSet通过使用hashcodeequals来保证不存入重复的元素:
    • HashSet通过元素的hashcode()equals() 方法来判断元素是否重复
    • HashSet首先获取对象的hashcode值来得到对象的加入位置,同时和其余元素的hashcode值进行比较,如果不同元素的hashcode值不相等,那么就认定这两个对象就是不同的元素,将元素加入到HashSet
    • 如果多个元素的hashcode值相同,就继续使用equals() 进行比较.如果equals() 返回true. 那么就认定这两个对象是相同的元素,加入HashSet失败
    • 如果多个元素的hashcode值相同,继续使用equals() 进行比较 ,equals() 返回false. 那么这两个对象不是同一个元素.这样的hashcode值相同equals() 方法比较为fasle的两个元素会在同一个hashcode值下顺延,可以认为两个hashcode值相同的元素存储在一个哈希桶中
  • 哈希桶: 一个hashcode值的位置上可以存放多个元素
  • 自定义类对象时需要重写对象的hashcode() 方法,确保对象具有相同的hashcode

TreeSet

有序性

  • TreeSet中存储的元素是有序的
  • TreeSet中元素的排序规则:
    • 存入的元素自定义比较规则
      • 元素自身具备比较性
      • 元素实现Comparable接口,重写compareTo() 方法.使得元素自身具备了比较性
      • 这种方式称做元素的自然排序.默认排序方式
    • 指定TreeSet的比较规则
      • 元素自身不具备比较性,或者是自身具备的比较性不是排序所需要的比较性.此时可以使得容器本身具备比较性
      • 定义一个类实现Comparator接口,重写compare() 方法,并且将接口的子类实例对象作为参数传递给TreeMap集合的构造方法
  • 注意:
    • 同时使用ComparableComparator两种比较方式时,以Comparator的比较方式为主
    • 重写compareTo() 方法和compare() 方法时,必须要明确比较的主要条件相等时要比较的次要条件
    • 存入TreeSet中的元素要具备比较性

唯一性

  • TreeSet属于Set集合,集合中的元素是不能重复的
  • TreeSet中保证数据的唯一性:
    • TreeSet通过compareTo() 方法或者compare() 方法来保证元素的唯一性
    • TreeSet中加入的元素实现Comparable接口或者Comparator接口,当使用compareTo() 方法或者compare() 方法比较返回值为0时,说明两个对象相等,也就是两个元素重复,元素不会加入到TreeSet

LinkedHashSet

  • LinkedHashSet会保证元素的插入顺序
  • LinkedHashSet中的元素按照元素的插入顺序排序

总结

  • Array => 索引位置
  • Link => 插入的第一个元素fisrt, 插入的最后一个元素last
  • Hash => 对象的hashcodeequals() 方法
  • Tree => 比较接口Comparable和比较接口Comparator

以上是关于架构师数据结构技术Day03-集合之Set的主要内容,如果未能解决你的问题,请参考以下文章

Java架构师成长之道之Java架构师技术栈

架构师之路Learn Day7之Hive生产环境最佳实践

java架构师亲临分享高可用技术之数据库分库分表

进阶大数据架构师学习路线

DAY 013--set(增删改查关系)

进阶大数据架构师学习指导路线