zoukankan      html  css  js  c++  java
  • 35 、HashSet详解

    HashSet特点

    1、不能保证元素的排列顺序

    2、没有重复元素

    3、HashSet不是同步的,多个线程同时访问一个HashSet,需要通过代码来保持同步

    4、集合元素可以是null

      当向HashSet中添加元素时,通过对象的HashCode方法来决定元素的存储位置。当两个元素equals相同,HashCode不相同时,HashSet也会看作两个不同元素;当两个元素HashCode相同,equals不同时,HashSet试图把它们保存着同一个位置,但又不行,所以实际上回在这个位置使用链式结构来保存多个对象,这样导致性能下降。

    案例:

     1 class A{
     2     public boolean equals(Object obj) {
     3         return true;
     4     }
     5 }
     6 
     7 class B{
     8     public int hashCode() {
     9         return 1;
    10     }
    11 }
    12 class C{
    13     public boolean equals(Object obj) {
    14         return true;
    15     }
    16     public int hashCode() {
    17         return 2;
    18     }
    19 }
    20 public class Test{
    21 
    22     public static void main(String[] args) {
    23         Set set=new HashSet();
    24         set.add(new A());
    25         set.add(new A());
    26         set.add(new B());
    27         set.add(new B());
    28         set.add(new C());
    29         set.add(new C());
    30         System.out.println(set);
    31     }
    32 }

    输出结果:[B@1, B@1, C@2, A@6bbc4459, A@7150bd4d]

     【注意】:如果要把某个类的对象保存到HashSet集合中,重写这个类的equals方法和hashCode方法时,应该尽量保证两桶对象通过equals方法比较返回为true时,它们的hashCode方法返回值也相等

    LinkedHashSet类

      HashSet还有一个子类,LinkedHashSet,LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序来保存的。也就是说,当遍历LinkedHashSet集合里的元素时,会按照元素插入顺序来访问元素。

      正因为LinkedHashSet需要维护元素的插入顺序,所以性能略低于HashSet,但是在迭代方位Set里的全部元素时将会有很好的性能

  • 相关阅读:
    extgcd 扩展欧几里得算法模板
    51nod 1073约瑟夫环
    UVA 11806 Cheerleaders (容斥原理
    HDU 1863 畅通工程 (最小生成树
    并查集模板
    51NOD 1072 威佐夫游戏
    Java基于JAX-RD开发Restful接口
    tomcat的webapps下放置多个项目时会出现很多exception
    带滚动条的表格
    禁止apache显示目录索引的常见方法
  • 原文地址:https://www.cnblogs.com/caoyc/p/5538136.html
Copyright © 2011-2022 走看看