HashSet、TreeSet 总结

HashSet:

1、概述:

向一个 HashSet 集合中存入一个元素时, HashSet 会调用该对象的 hashCode()方法得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。如果两个元素通过 equals()方法比较返回 true,但它们的 hashCode 不同,HashSet 将会把它们存储在不同的位置,可以添加成功,所以, HashSet 集合判断两个元素是否一样的标准是两个对象的 equals()方法和 hashCode()方法返回的值都相同。下面的例子可以帮我们验证:

上面的例子中,类 A 重写了 equals()方法,而且都返回 true;类 B 重写了 hashCode()方法,都返回1;类 C 重写了 equals()和 hashCode()方法,返回固定值。此时,我们往 HashSet 集合中分别添加两个ABC对象然后打印出来,可以看出,里面有两个 A 对象,两个 B 对象,一个 C 对象。

不过,当我们需要把对象存入 HashSet 中,并且重写了 equals()方法的时候,我们应该重写 hashCode()方法,而且应该保证equals()方法返回 true 时,hashCode()返回值也应该相等。如果 hashCode()方法返回值不同,两个对象就会都存储到集合中,这就与存储元素不能重复相冲突。而当 hashCode()方法返回相同时,equals()应该返回 true。因为 hashCode()方法返回相同而 equals()方法返回 false 时,两个对象会保存在同一位置,这个时候这个位置会采用链式结构保存多个对象。HashSet 访问集合元素时是根据 hashCode 值来快速定位的,如果集合中有多个元素 hashCode 相同,会影响访问性能。(HashSet 访问元素时会根据 hashCode 快速计算出该元素所在的位置,从而快速定位该元素)

2、特点:

a、不能保证元素的排列顺序,排列顺序可能和添加顺序不同,而且有可能发生变化。

b、HashSet 不是同步的,如果多个线程同时访问一个 HashSet,假设有多个线程同时修改了 HashSet 集合时,要通过代码来保证其同步。

c、集合元素可以为 null。

3、LinkedHashSet:                 

LinkedHashSet 是 HashSet 的子类。也是根据元素的 hashCode 值来决定元素的存储位置,同时它使用链表维护元素的顺序,这样我们遍历 LinkedHashSet 的时候会按照元素添加的顺序取出元素。

TreeSet:

1、概述:

TreeSet 是 SortedSet 接口的实现类。SortedSet 可以确保集合元素处于排序状态。TreeSet 是采用红黑树的数据结构来存储集合元素的。 TreeSet 支持两种排序方法:自然排序和定制排序。

从输出日志可以看出,元素并不是按照 add 的顺序排列的,是按照加入整型数据的大小排列的。

2、自然排序:

自然排序是 TreeSet 调用集合元素的 compareTo(Object object)方法来比较元素之间的大小关系,然后将集合元素按升序排列。所以,当我们采用自然排序的时候,添加到 TreeSet 的元素必须实现 Comparable 接口,而且添加元素应该是相同类型,否则会报 ClassCastException 异常。Java 中一些常用类已经实现了 Comparable 接口:BigDecimal、BigInteger、Character、Boolean、String、Date、Time等。

如图,当 compareTo 方法返回为0时,认为两个元素是相等的,不为0则不相等。所以,当我们需要把一个对象放入 TreeSet 中去,又重写该类的 equals()方法的时候,我们应该保证在 equals()方法返回 true 的时候,compareTo 方法返回的是0。

已经加入 TreeSet 集合的元素不要修改变量值,这容易导致一些错误。如图:

如果我们修改后导致元素相等,这个时候 TreeSet 是不会重新排序的,这个时候我们如果想删除修改后的元素会失败,而且和修改后元素相等的元素也会删除失败。不过我们可以正常删除没有改变的元素。

3、定制排序:

自然排序是根据集合元素的大小升序。如果我们想降序或者按照自己的意愿排序,我们可以通过 Comparator 接口实现。在我们创建 TreeSet 集合对象时,我们需要提供一个 Comparator 对象关联 TreeSet,实现 compare 方法。如果该方法返回正数,表示 o1 大于 o2;如果返回0,表示 o1 等于 o2;如果返回负数,表示 o1 小于 o2。如图所示:

总结:

HashSet 的性能比 TreeSet 好,特别是常用的添加、查询等操作。只有需要排序的时候,我们才使用 TreeSet。LinkedHashSet 对于普通的插入、删除操作,比 HashSet 会慢一点,但是遍历会更快。

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

推荐阅读更多精彩内容

  • 上一篇文章介绍了Set集合的通用知识。Set集合中包含了三个比较重要的实现类:HashSet、TreeSet和En...
    Ruheng阅读 15,605评论 3 57
  • Java集合框架 Java平台提供了一个全新的集合框架。“集合框架”主要由一组用来操作对象的接口组成。不同接口描述...
    小石38阅读 356评论 0 0
  • 3.3 集合 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另...
    闫子扬阅读 715评论 0 1
  • 如果得不到,真的是自己做的不够好,这个原因占了多数,如果说失去了就会有更好的选择这真的是安慰自己,但是又能怎么样呢...
    Serene汤先允阅读 131评论 0 0
  • 主要区别 1).MyISAM是非事务安全型的,而InnoDB是事务安全型的。2).MyISAM锁的粒度是表级,而I...
    _Henry_阅读 278评论 0 0