java集合框架总结(五)

来源:互联网 发布:java 国家精品课程 编辑:程序博客网 时间:2024/05/17 09:46

一、Set接口 概述

 Set 接口继承 Collection 接口,而且它不允许集合中存在重复项,每个具体的 Set 实现类
依赖添加的对象的 equals()方法来检查独一性。Set接口没有引入新方法,所以Set就是一
个Collection,只不过其行为不同。  然后来说Set接口的3种实现.

二:HashSet概述

  • HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
  • HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
  • HashSet 具有以下特点:不能保证元素的排列顺序,HashSet 不是线程安全的,集合元素可以使 null
  • HashSet的对象必须实现hashCode方法,javaAPI大多数类实现了hashCode方法。
  • 当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。
  • 如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相等,hashSet 将会把它们存储在不同的位置,但依然可以添加成功。
  • HashSet 集合判断两个元素相等的标准:两个对象通过 equals() 方法比较相等,并且两个对象的 hashCode() 方法返回值也相等。如果两个对象通过 equals() 方法返回 true,这两个对象的 hashCode 值也应该相同.
  • 重写 hashCode() 方法的基本原则:
    -在程序运行时,同一个对象多次调用 hashCode() 方法应该返回相同的值
    -当两个对象的 equals() 方法比较返回 true 时,这两个对象的 hashCode() 方法的返回值也应相等
    -对象中用作 equals() 方法比较的 Field,都应该用来计算 hashCode 值

三:LinkedHashSet

  • LinkedHashSet 是 HashSet 的子类,支持规则集内元素的排序,在HashSet中元素是没有顺序的,而在LinkedHashSet中,可以按元素插入集合的顺序进行提取
  • LinkedHashSet 集合根据元素的 hashCode 值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。
  • LinkedHashSet 性能插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。
  • LinkedHashSet 不允许集合元素重复。

 

四:TreeSet

  • TreeSet 是 SortedSet 接口的实现类,TreeSet 可以确保集合元素处于排序状态。
  • TreeSet 支持两种排序方法:自然排序和定制排序。默认情况下,TreeSet 采用自然排序。
    • 自然排序:因为只有相同类的两个实例才会比较大小,所以向 TreeSet 中添加的应该是同一个类的对象当需要把一个对象放入 TreeSet 中,重写该对象对应的 equals() 方法时,应保证该方法与 compareTo(Object obj) 方法有一致的结果:如果两个对象通过 equals() 方法比较返回 true,则通过 compareTo(Object obj) 方法比较应返回 0
      • TreeSet 会调用集合元素的 compareTo(Object obj) 方法来比较元素之间的大小关系,然后将集合元素按升序排列如果试图把一个对象添加到 TreeSet 时,则该对象的类必须实现 Comparable 接口。
      • 实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。
      • Comparable 的典型实现:BigDecimal、BigInteger 以及所有的数值型对应的包装类:按它们对应的数值大小进行比较
      • Character:按字符的 UNICODE 值来进行比较
      • Boolean:true 对应的包装类实例大于 false 对应的包装类实例
      • String:按字符串中字符的 UNICODE 值进行比较
      • Date、Time:后边的时间、日期比前面的时间、日期大
    • 定制排序:如果需要实现定制排序,则需要在创建 TreeSet 集合对象时,提供一个 Comparator 接口的实现类对象。由该 Comparator 对象负责集合元素的排序逻辑
       
  • TreeSet保证集中的元素是有序的,有2种方法可以实现对象之间的可比较性:1,添加到TreeSet的对象实现了Comparable接口;2,给规则集的元素指定一个比较器(Comparator),主要方法:
    • Comparator comparator()
      Object first()
      Object last()
      Object lower(Object e)
      Object higher(Object e)
      SortedSet subSet(fromElement, toElement)
      SortedSet headSet(toElement)
      SortedSet tailSet(fromElement)
0 0