【转】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()必须能够唯一的确定一个对象。

 

posted on 2015-05-07 17:22  wi100sh  阅读(421)  评论(0编辑  收藏  举报

导航