• 【转】HashSet的用法


    原文网址:http://blog.csdn.net/aidesudi/article/details/4720201

    Java代码
    1. public class TestHashSet {   
    2.   
    3.     public static void main(String [] agrs){   
    4.         Set set = new HashSet();   
    5.         //添加一个string数据   
    6.         set.add("文本");   
    7.         //添加一个整数数据   
    8.         set.add(new Integer(5));   
    9.         //添加一个付点数据   
    10.         set.add(12.15);   
    11.         //输出集合大小   
    12.         System.out.println(set.size());   
    13.         //在添加个相同的文本   
    14.         set.add("文本");   
    15.         //输出大小   
    16.         System.out.println(set.size());   
    17.         //添加个null值   
    18.         set.add(null);   
    19.         //输出集合大小   
    20.         System.out.println(set.size());   
    21.         //再添加个null值   
    22.         set.add(null);   
    23.         //输出集合大小   
    24.         System.out.println(set.size());   
    25.         //判断是否存在null值   
    26.         System.out.println(set.contains(null));   
    27.         // 删除null值   
    28.         set.remove(null);   
    29.         //判断是否存在null值   
    30.         System.out.println(set.contains(null));   
    31.         //输出集合大小   
    32.         System.out.println(set.size());   
    33.            
    34.         Set set1 = new HashSet();   
    35.         UserInfo user = new UserInfo("abc","123");   
    36.         UserInfo user1 = new UserInfo("abc","123");   
    37.         set1.add(user);   
    38.         System.out.println(set1.size());   
    39.         //判断是否存在user1这个对象   
    40.         System.out.println(set1.contains(user1));   
    41.         user.setName("xyz");   
    42.         user.setPassword("aaa");   
    43.         //在更改了user值后user1还存在吗?   
    44.         System.out.println(set1.contains(user1));   
    45.            
    46.     }   
    47. }   
    48.   
    49. public class UserInfo {   
    50.     private String name;   
    51.     private String password;   
    52.     private int HASHCODE= Integer.MIN_VALUE;   
    53.        
    54.     public UserInfo(String name,String password){   
    55.         this.name = name;   
    56.         this.password = password;   
    57.     }   
    58.     public String getName() {   
    59.         return name;   
    60.     }   
    61.     public void setName(String name) {   
    62.         this.name = name;   
    63.     }   
    64.     public String getPassword() {   
    65.         return password;   
    66.     }   
    67.     public void setPassword(String password) {   
    68.         this.password = password;   
    69.     }   
    70.        
    71.     public int hashCode() {    
    72.         if (HASHCODE == Integer.MIN_VALUE) {    
    73.            // 重新生成本类的hashCode    
    74.           HASHCODE = name.hashCode() + password.hashCode();        
    75.         }    
    76.         return HASHCODE;    
    77.       }    
    78.        
    79.     //判断值是否相等   
    80.     public boolean equals(Object obj) {   
    81.         if(obj == null || !(obj  instanceof  UserInfo)){   
    82.             return false;   
    83.         }   
    84.         UserInfo user = (UserInfo)obj;   
    85.         return this.name == user.name && this.password ==  user.password;   
    86.     }   
    87. }   

    从上面的简单添加,和输出结果我想大家已经知道了set的一些用法和特性了。

    1.    HashSet允许null值。

    2.       HashSet中值不能重复。

    3.       Hashset在判断是否存在同一个对象的时候首先会判断对象的hashcode是否相等,然后在判断对象的equals()是否相等。当你向HashSet中存入重复元素时,他会按照正常的流程执行存入操作
    底层的数据结构采用的是数组+链表的存储结构(明白这一点对于理解HashSet的原理非常重要),
    也就是说数组中的每一个元素都是一个链表(对应java中的List的某一具体实现),
    这样当有元素要存入HashSet中时,便会首先通过hashCode()方法得到该对象的一个哈希码,并利用该哈希码通过一些转换算法映射成数组的下标索引(当查找时也是如此,因此会非常的快),接下来便会判断该下标处是否为null若为null则会创建一个列表,此时将待插入的对象直接插入,若列表已经存在则利用equals()方法将带插入对象与列表中的元素逐个比较,相等则忽略,不存在相等元素则直接插入。
    因此不同对象的hashCode()是可以相同的(最好是均匀的散列开,这样才能充分的提高访问及插入的速度),
    根据equals()判定相等的对象所产生的hashCode()必须相等(根据其原理不难理解,否则的话便会有重复元素出现了)
    保证一点  hashCode()与equals()必须能够唯一的确定一个对象。

  • 相关阅读:
    vue 客户端渲染和服务端渲染
    js 数组对象深拷贝
    vue template标签
    vue watch的高级用法
    js对象数组去重
    移动端触发touchend后阻止click事件
    重读JS(四)数据类型、作用域和内存问题
    重读JS(三)基本概念
    vue项目
    [vue问题解决]vue <router-link>在浏览器上点击失效(路由不跳转)
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4485508.html
Copyright © 2020-2023  润新知