1004--Java集合--Set 接口

来源:互联网 发布:openwrt网络尖兵 编辑:程序博客网 时间:2024/05/21 20:23
--Set接口是Collection的子接口,set接口没有提供额外的方法
--Set 集合不允许包含相同的元素,
  如果试把两个相同的元素加入同一个 Set集合中,则添加操作失败。
--Set 判断两个对象是否相同不是使用==运算符,
   而是根据 equals 方法
 
Set实现类之一:HashSet
--HashSet是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
--HashSet按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
--HashSet具有以下特点:
  Ø不能保证元素的排列顺序
  ØHashSet不是线程安全
  Ø集合元素可以是 null
  当向 HashSet集合中存入一个元素时,
   HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,
   然后根据 hashCode值决定该对象在HashSet中的存储位置。
   HashSet集合判断两个元素相等的标准
    两个对象通过 hashCode() 方法比较相等,
    并且两个对象的 equals()方法返回值也相等
 
 /*
  * Set:存储的元素是无序的,不可重复的!
  *  1.无序性:无序性!= 随机性。真正的无序性,指的是元素在底层存储的位置是无序的。
  * 2.不可重复性:当向Set中添加进相同的元素的时候,后面的这个不能添加进去。
  *
  * 说明:要求添加进Set中的元素所在的类,一定要重写equals()和hashCode()方法。 进而保证Set中元素的不可重复性!
  *
  * Set中的元素时如何存储的呢?使用了哈希算法。
  * 当向Set中添加对象时,首先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值
  * 决定了此对象在Set中的存储位置。若此位置之前没有对象存储,则这个对象直接存储到此位置。若此位置
  * 已有对象存储,再通过equals()比较这两个对象是否相同。如果相同,后一个对象就不能再添加进来。 万一返回false呢,都存储。(不建议如此)
  * >要求:hashCode()方法要与equals()方法一致。
  */
 hashCode() 方法
--如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相等,
   hashSet将会把它们存储在不同的位置,但依然可以添加成功。
--对于存放在Set容器中的对象,
   对应的类一定要重写equals()hashCode(Objectobj)方法,以实现对象相等规则。
--重写 hashCode()方法的基本原则
  Ø在程序运行时,同一个对象多次调用 hashCode()方法应该返回相同的值
  Ø当两个对象的 equals()方法比较返回true 时,这两个对象的 hashCode()方法的返回值也应相等
  Ø对象中用作 equals()方法比较的Field,都应该用来计算hashCode
 
Set实现类之二:LinkedHashSet
--LinkedHashSetHashSet的子类
--LinkedHashSet根据元素的hashCode值来决定元素的存储位置,
   但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
--LinkedHashSet插入性能略低于HashSet
   但在迭代访问 Set 里的全部元素时有很好的性能。
--LinkedHashSet不允许集合元素重复。
 
Set实现类之三:TreeSet
--TreeSetSortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态。
  ØComparator comparator()
  ØObject first()
  ØObject last()
  ØObject lower(Object e)
  ØObject higher(Object e)
  ØSortedSetsubSet(fromElement,toElement)
  ØSortedSetheadSet(toElement)
  ØSortedSettailSet(fromElement)
 /*
  * TreeSet: 1.向TreeSet中添加的元素必须是同一个类的。
  * 2.可以按照添加进集合中的元素的指定的顺序遍历。像String,包装类等默认按照从小到大的顺序遍历。
  * 3.当向TreeSet中添加自定义类的对象时,有两种排序方法:①自然排序②定制排序
  * 4.自然排序:要求自定义类实现java.lang.Comparable接口并重写其compareTo(Object obj)的抽象方法
  * 在此方法中,指明按照自定义类的哪个属性进行排序。
  *
  * 5.向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象的此
  * 属性值相同,但是程序会认为这两个对象是相同的,进而后一个对象就不能添加进来。
  *
  * >compareTo()与hashCode()以及equals()三者保持一致!
  */
 
--TreeSet两种排序方法:自然排序定制排序。默认情况下,TreeSet采用自然排序。
 
排  序——自然排序
--自然排序
    TreeSet会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序排列
    如果试图把一个对象添加到TreeSet时,则该对象的类必须实现Comparable接口。
   Ø实现 Comparable的类必须实现compareTo(Objectobj)方法,
    两个对象即通过 compareTo(Objectobj)方法的返回值来比较大小。
    
   Comparable 的典型实现:
    ØBigDecimal、BigInteger以及所有的数值型对应的包装类:按它们对应的数值大小进行比较
    ØCharacter:按字符的unicode值来进行比较
    ØBoolean:true对应的包装类实例大于false对应的包装类实例
    ØString:按字符串中字符的unicode值进行比较
    ØDate、Time:后边的时间、日期比前面的时间、日期大
 
--向 TreeSet中添加元素时,只有第一个元素无须比较compareTo()方法,
  后面添加的所有元素都会调用compareTo()方法进行比较。
--因为只有相同类的两个实例才会比较大小,所以向TreeSet中添加的应该是同一个类的对象
--对于 TreeSet集合而言,它判断两个对象是否相等的唯一标准是:
   两个对象通过 compareTo(Objectobj)方法比较返回值
--当需要把一个对象放入 TreeSet中,重写该对象对应的equals()方法时,
   应保证该方法与 compareTo(Objectobj)方法有一致的结果:
   如果两个对象通过 equals()方法比较返回true
   则通过 compareTo(Objectobj)方法比较应返回0
0 0
原创粉丝点击