欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

【转】HashSet的用法

发布时间:2025/3/15 编程问答 30 豆豆
生活随笔 收集整理的这篇文章主要介绍了 【转】HashSet的用法 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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

Java代码
  • public class TestHashSet {   
  •   
  •     public static void main(String [] agrs){   
  •         Set set = new HashSet();   
  •         //添加一个string数据   
  •         set.add("文本");   
  •         //添加一个整数数据   
  •         set.add(new Integer(5));   
  •         //添加一个付点数据   
  •         set.add(12.15);   
  •         //输出集合大小   
  •         System.out.println(set.size());   
  •         //在添加个相同的文本   
  •         set.add("文本");   
  •         //输出大小   
  •         System.out.println(set.size());   
  •         //添加个null值   
  •         set.add(null);   
  •         //输出集合大小   
  •         System.out.println(set.size());   
  •         //再添加个null值   
  •         set.add(null);   
  •         //输出集合大小   
  •         System.out.println(set.size());   
  •         //判断是否存在null值   
  •         System.out.println(set.contains(null));   
  •         // 删除null值   
  •         set.remove(null);   
  •         //判断是否存在null值   
  •         System.out.println(set.contains(null));   
  •         //输出集合大小   
  •         System.out.println(set.size());   
  •            
  •         Set set1 = new HashSet();   
  •         UserInfo user = new UserInfo("abc","123");   
  •         UserInfo user1 = new UserInfo("abc","123");   
  •         set1.add(user);   
  •         System.out.println(set1.size());   
  •         //判断是否存在user1这个对象   
  •         System.out.println(set1.contains(user1));   
  •         user.setName("xyz");   
  •         user.setPassword("aaa");   
  •         //在更改了user值后user1还存在吗?   
  •         System.out.println(set1.contains(user1));   
  •            
  •     }   
  • }   
  •   
  • public class UserInfo {   
  •     private String name;   
  •     private String password;   
  •     private int HASHCODE= Integer.MIN_VALUE;   
  •        
  •     public UserInfo(String name,String password){   
  •         this.name = name;   
  •         this.password = password;   
  •     }   
  •     public String getName() {   
  •         return name;   
  •     }   
  •     public void setName(String name) {   
  •         this.name = name;   
  •     }   
  •     public String getPassword() {   
  •         return password;   
  •     }   
  •     public void setPassword(String password) {   
  •         this.password = password;   
  •     }   
  •        
  •     public int hashCode() {    
  •         if (HASHCODE == Integer.MIN_VALUE) {    
  •            // 重新生成本类的hashCode    
  •           HASHCODE = name.hashCode() + password.hashCode();        
  •         }    
  •         return HASHCODE;    
  •       }    
  •        
  •     //判断值是否相等   
  •     public boolean equals(Object obj) {   
  •         if(obj == null || !(obj  instanceof  UserInfo)){   
  •             return false;   
  •         }   
  •         UserInfo user = (UserInfo)obj;   
  •         return this.name == user.name && this.password ==  user.password;   
  •     }   
  • }   
  • 从上面的简单添加,和输出结果我想大家已经知道了set的一些用法和特性了。

    1.    HashSet允许null值。

    2.       HashSet中值不能重复。

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

     

    转载于:https://www.cnblogs.com/wi100sh/p/4485508.html

    总结

    以上是生活随笔为你收集整理的【转】HashSet的用法的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。