黑马程序员__Java集合框架SET集合

来源:互联网 发布:骨关节功能解剖学知乎 编辑:程序博客网 时间:2024/05/17 06:30


  ------- android培训、java培训、期待与您交流! ----------

Set集合

  不允许存储重复元素,没有下标,无序集合,存储的顺序和取出的顺序不一定一致

  Set接口中的方法,和Collection中的方法一致的

1. HashSet集合

  底层是哈希表结构

  线程不安全

  允许存储null

  无序,不重复

  为什么存储自定义对象,重写了equals没有效果

  HashSet底层的哈希表的原理,如何去掉重复对象呢

  哈希值:

    每一个对象,都有自己的哈希值

    哈希值是一个对象建立后,JVM根据哈希算法,计算出来的一个十进制数

    这个十进制数就是哈希值

    Person@123EA21

    123EA21 哈希值,哈希值不是地址值

    在Object类中,有一个方法hashCode()计算哈希值的,本地方法

    程序演示哈希值

    结论,HashSet集合,存储对象的时候

    依据是对象的哈希值码,如果对象的哈希值一致,再次比较equals

    返回真,同一个对象,不存储

    返回假,后进来的对象,像笼屉一样,挂靠在上一个对象的下面

    哈希值,存储的是哈希值,桶状结构

   当将对象存储到HashSet集合的时候,集合首先会调用对象的hashCode方法,获取哈希值

   ,如果两个对象的哈希值一致,再次调用equals方法

   自定义定的对象,有肯能被存储到HashSet集合,必须重写hashCode equals方法

 2. 两个对象

   如果哈希值相同 equals 一定返回真吗  No

   如果equals返回真,两个对象一定具有相同的哈希值吗  YES

 3. TreeSet 集合

   TreeSet集合,对存储到的对象进行排序

   在TreeSet集合中,存储自定义对象的时候,抛出类型转换异常

   Person不能被转换成java.lang.Comparable

   此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序

   实现这个接口的累,进行整体排序,自然顺序

   TreeSet集合,需要对存储的对象进行排序,TreeSet集合排序的依据是什么?

   依据的是对象的自然顺序,凡是实现了Comparable接口的,都叫做自然顺序

   Person类,没有实现Comparable接口,不具备自然顺序

   JDK1.7,1.5版本,TreeSet存储一个对象,出现异常,对象没有自然顺序

   JDK1.6版本,存储一个对象,不会出现异常,存储一个以上的时候,出现异常

   存储的是String类对象,被TreeSet排序了,并且没有异常

   String类实现了Comparable接口

   String类,比较自然顺序的方法compareTo

     s1.compareTo(s2)

     如果s1 比 s2 小  小于0

     如果s1 比 s2 大  大于0

     如果s1 和s2一样  返回0

  存储字符串的时候,TreeSet集合,会调用String类中的compareTo方法,实现排序

  TreeSet(Comparator comparator) 

          构造一个新的空 TreeSet,它根据指定比较器进行排序。

  TreeSet集合,构造方法中,传递一个参数,Comparator类型

  Comparator是一个比较器,用来比较对象的

  java.lang.Comparable 实现接口,类具备了自然顺序

  java.util.Comparator 比较器,比较器优先

  定义类,实现Comparator接口

  建立TreeSet对象的时候,在构造方法中,传递接口的实现类对象

  TreeSet集合,就会安照自定义的比较器进行排序了

  定义比较器三步骤

    定义类,实现java.util.Comparator接口

    重写compare方法

    建立TreeSet集合,传递比较器对象

 4. TreeSet集合案例

   集合中存储String对象,按照长度排序,如果长度一致,按照字典顺序排序

   String类,自己具备自然顺序,实现长度排序,自己写比较器

Set集合总结

 Set集合特点,无序,不重复,没有下标

1. HashSet

  A. 底层哈希表结果,桶状结构

  B. 线程不安全的

  C. 允许存储null

  D. 存储到HashSet集合中的对象,要求重写hashCode和equals方法,保证对象的唯一行

    如果两个对象的哈希值(对象中的hashCode方法获取)一致,不是一个对象存储

    如果两个对象的哈希值一致,集合再次调用对象的equals方法进行比较,equals返回真,同一对象不存储

    如果两个对象的equals方法,返回假,就将后进来的对象,挂靠在前一个对象的下面

2. TreeSet

 A. TreeSet集合会对存储的对象进行排序

 B. 对象具备自然顺序

   类实现Comparable接口,重写compareTo方法

 C. TreeSet线程不安全的集合

 D. 底层数据结构,二叉树

 E. TreeSet自己具备比较性

   自己定义比较器

    定义类,实现java.util.Comparator接口

    重写compare方法

    建立TreeSet集合,传递比较器对象

 F. 传递了比较器对象,TreeSet集合不会理会对象的自然顺序



  ------- android培训、java培训、期待与您交流! ----------

0 0