zoukankan      html  css  js  c++  java
  • 【转】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()必须能够唯一的确定一个对象。

  • 相关阅读:
    《Programming WPF》翻译 第8章 1.动画基础
    一些被遗忘的设计模式
    《Programming WPF》翻译 第4章 数据绑定
    《Programming WPF》翻译 第3章 控件
    《Programming WPF》翻译 第5章 样式和控件模板
    《Programming WPF》翻译 第7章 绘图
    《Programming WPF》翻译 第9章 自定义控件
    《Programming WPF》翻译 第7章 绘图 (2)
    《Programming WPF》翻译 第8章 前言
    关于Debug和Release之本质区别
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4485508.html
Copyright © 2011-2022 走看看