• 11、集合--Set接口


      

    Set如同一个罐子,可以把对象丢尽set集合

    集合里多个对象之间没有明显的顺序

    Set集合与Collection基本类似没有提供额外的方法

    可以说Set就是一个Collection,只不过行为不同

    Set不允许包含两个相同的元素

    如果添加两个相同的元素,add()方法会返回false,并且不会添加新元素

    基础知识

    1、Hash表

    Hash表是一种数据结构,用于查找对象。

    Hash表位每个对象计算出一个整数称为Hash Code(哈希码)

    Hash表是个链接式的队列

    每个列表称为一个buckets(哈希表元)

    对象位置的计算index = hashCode % buckets

    HashCode为对象哈希码

    buckets为哈希表元总数

    添加元素时

    有时会遇到已经填充了元素的哈希表元

    这种情况称为Hash Collections 哈希冲突

    此时必须判断该元素是否以及该存在该哈希表中

    2、Comparable接口和Comparator接口

    在“集合框架”中有两种比较接口,分别时ComparableComparator接口

    像String和Integer等Java内建实现Comparable接口提供一定的排序方式

    但是只能实现该接口一次

    2.1、Comparable接口

    在java.lang中,接口Comparable适用于一个类有自然排序

    假定对象集合时同一个类型,该接口允许我们把集合排序成自然顺序

    主要的方法:

    利用Comparable接口创建自己的类

    只是实现compareTo()方法的问题

    通常就是依赖几个数据成员的自然排序

    同时类也应该覆盖equals()和hashCode()方法确保两个相等的对象返回一个哈希码

    2.2、Comparator接口

    可以使用自己的排列顺序

    可以实现Comparator接口来定义一个比较器

    ---int compare(Object o1,Object o2):对o1、o2进行比较

    ---boolean equals(Object obj)z=:指示对象obj是否和比较器相等

    2.3、SortedSet接口

    提供了一个特殊的set接口SortedSet,他保持元素的有序顺序

    此接口主要用于排序操作

    即实现此接口的子类都属于排序的子类

    添加到SortedSet实现类的元素都必须实现Comparable接口

    否则必须给他的构造函数提供一个Compatator接口类的实现

    类TreeSet是他的唯一一份实现

    因为集必须包含唯一的项

    如果添加元素时比较两个元素导致了0返回值

    那么新元素姐没有添加进去

    如果两个元素相等

    但是如果不相等的话接下来就应该修改比较方法

    让比较方法和equals()的效果一致

    1、Comparator comparator():返回对元素进行排序时使用的比较器

      如果使用Comparable接口的compareTo()方法对元素进行比较,则返回null

    2、Object first():返回有序集合中第一个元素

    3、Object last():返回有序集合中的最后一个元素

    4、SotredSet subSet(Object fromElement,Object toElement):

      反回从fromElement至toElement范围内的SoredSet视图集

    5、SotredSet headSet(Object toElement):返回SotredSet的一个视图,期内各个元素皆小于toElement

    6、SotredSet tailSet(Object fromElement):返回SotredSet的一个视图,期内各个元素皆大于fromElement(可等于) 

    2.4、AbstractSet

    AbstractSet类覆盖了Object的equals()和hashCode()方法

    以确保两个相等的集返回的相同的哈希码

    如果两个集大小相等且包含相同元素,则这两个集相等

    按照定义,集的哈希码是集中元素哈希码的总和

    因此无论按照内部的顺序如何,两个相等的集都会有相同的哈希码

    2.5、HashSet和TreeSet

    Java集合框架支持Set接口的两种普通实现

    在更多情况下回使用HashSet存储重复自由的集合

    考虑到效率,添加到HashSet的对象需要采用恰当分配哈希码的方式来实现hashCode()

    虽然大多数系统类覆盖了Object中缺省的hashCode()和equals()实现

    当创建自己要添加HashSet时,需要覆盖这两个方法

    当我们要从集合中以有序的方式插入和抽取元素时

    Tree实现会有用处

    添加到TreeSet的元素必须时可排序的

    2.6、LinkedHashSet

    是HashSet的扩展

    如果想要跟踪添加给HashSet的元素的顺序

    使用LinkedHashSet实现会有很大的帮助

    LinkedHashSet的迭代器按照元素的插入顺序来访问各个元素

    它提供了一个可以快速访问各个元素的有序集合

    同时也增加了实现的代价

    因为哈希表元中的各个元素都是通过双重链接式列表链接在一起

  • 相关阅读:
    学习练习 java输入输出流 练习题1
    学习总结 java Iterator迭代器练习
    学习总结 java 输入输出流
    学习记录 java 哈希
    学习记录 java 链表知识
    学习总结 java 异常
    学习练习 java 集合
    web压缩gzip响应
    web乱码问题
    web附件中文名
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/10849787.html
Copyright © 2020-2023  润新知