10 Java集合 - Set集合

10.1 Set集合

        Set接口继承Collection接口,没有提供额外的方法。Set集合不允许包含相同的元素,向Set集合添加已存在的元素时,add()方法返回false。

10.2 HashSet类

        HashSet按Hash算法存储集合中的元素,具有良好的性能。Hash会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象在集合里的存储位置。即HashSet集合采用hash算法来决定元素的存储位置

        HashSet中每个能存储元素的位置被称为“桶”。

    HashSet具有如下特点:

        - 元素的排列顺序与添加顺序不一定相同。

        - 不是线程同步的。

        - 集合元素可以是null

    HashSet判断两个元素相等的标准:

        两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。

    HashSet重写equals和hashCode方法的规则:

        如果两个对象通过equals()方法比较返回true,这两个对象的hashCode()值也应该相同。

    注意:如果HashSet存储了可变类,对某一个元素的更改致使集合中出现两个相同的元素,未被修改的元素可以被删除,修改后的元素无法被删除。因为HashSet根据hashCode值找到存储位置,然后用equals判断相等。

10.3 LinkedHashSet类

        LinkedHashSet类是HashSet类的子类,根据元素的hashCode值来决定元素的存储位置,使用链表维护元素的添加次序。遍历LinkedHashSet集合里的元素时,LinkedHashSet会按照元素的添加顺序来访问集合里的元素。

10.4 TreeSet类

        TreeSet类是SortedSet接口的实现类,TreeSet集合内的元素处于有序状态。TreeSet采用红黑树的数据结构来存储集合元素。TreeSet中应添加同一种类型的对象。

    TreeSet集合新增如下方法:

        - Comparator comparator():如果TreeSet使用的定制排序,此方法将返回使用的Comparator;若使用了自然排序,则返回null。

        - Object first():返回集合中的第一个元素。

        - Object last():返回集合中的最后一个元素。

        - Object lower(Object o):小于o的最大元素,o不需要存在集合中。

        - Object higher(Object o):大于o的最小元素,o不需要存在集合中。

        - SortedSet subSet(Object form, Object to):返回form(包括)到to(不包括)之间的元素作为子集合。

        - SortedSet headSet(Object to):返回小于to的元素作为子集合。

        - SortedSet tailSet(Object from):返回大于或等于from的元素作为子集合。

    实现了Compable接口的常用类及比较方式:

        - BigDecimal和所有的数值型对应的包装类。

        - Character按UNICODE值进行比较。

        - Boolean按true大于false比较。

        - String按字符串中字符的UNICODE值进行比较。

        - Date、Time类,后面的日期时间比前面的大。

    自然排序:

        TreeSet会调用集合元素的compareTo(Object o)方法来比较元素之间的大小关系,然后将集合元素按升序排序,即为自然排序。

        如果试图把一个对象添加到TreeSet时,该对象的类必须实现Comparable接口。如果对象的类未实现Comparable接口,那么在加入元素和取出元素时,程序将会抛出ClassCastException异常。

        注意:如果TreeSet集合存储了可变类,对某一个元素的更改致使集合中出现两个相同的元素,则未被修改的和修改以后的元素均不能被成功删除。只有删除其他未被修改的元素,并且TreeSet对元素重新索引之后,发生重复的元素才可以被删除。

    定制排序:

        创建TreeSet对象时传入一个Comparator实现类的对象,并且重写了int compare(T o1, T o2)方法。此时对象的类无须实现Comparable接口。

    TreeSet判断两个元素相等的标准:

        两个对象通过compareTo(Object o)方法比较返回0。

    TreeSet重写equals和compareTo方法的规则:

        如果两个对象通过equals方法比较返回true时,这两个对象通过compareTo方法比较应返回0。

10.5 EnumSet类

        EnumSet是专门为枚举设计的集合类,EnumSet中的所有元素必须为指定枚举类型的枚举值。EnumSet按枚举值在枚举类中的定义顺序对集合元素进行排序。

        EnumSet内部以位向量的形式进行存储。数据存储紧凑且高效,占用内存小,运行效率好。

        Enum集合不允许加入null元素

    EnumSet类提供如下类方法来创建对象(未提供构造器):

        - EnumSet allOf(Class enumType):创建一个包含指定枚举类所有枚举值的集合。

        - EnumSet complementOf(EnumSet s):创建一个EnumSet相对枚举类为补集的集合。

        - EnumSet copyOf(Collection c):根据只包含相同枚举类枚举值的普通集合来创建。

        - EnumSet copyOf(EnumSet s):根据EnumSet集合来创建,两个集合有相同的枚举值。

        - EnumSet noneOf(Class enumType):创建一个类型为指定枚举类的空集合。

        - EnumSet of(E first/E... rest):创建一个包含一个或多个枚举值的集合。

        - EnumSet range(E from, E to):根据枚举类中form到to之间的枚举值创建集合,包含两边值。

10.6 各Set类的性能分析

        HashSet的性能总是比TreeSet好,只有当需要一个保持排序的Set是,才考虑使用TreeSet。 LinkedHashSet在插入删除时,性能比HashSet差,但遍历元素时却更快。EnumSet是所有集合中性能最好的,但是只能保存同一枚举类中的枚举值。

        HashSet、TreeSet、EnumSet都是线程不安全的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342