`
baobeituping
  • 浏览: 1042059 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

HashSet的用法

阅读更多
  1. package collection.lession2;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. /**
  5.  * 老紫竹JAVA提高教程(2)-认识Set集合之HashSet。<br>
  6.  * Set用来保存不允许重复的数据。可以是任何对象类型。<br>
  7.  * JDK5以后,主类型可以通过autobox 放入Set里面。
  8.  * 
  9.  * @author 老紫竹 JAVA世纪网(java2000.net)
  10.  * 
  11.  */
  12. public class Lession2 {
  13.   public static void main(String[] args) {
  14.     // 普通测试
  15.     testNormal();
  16.     // 测试HashSet的特殊性
  17.     testForHashSet();
  18.     testForHashSet2();
  19.   }
  20.   /**
  21.    * 测试保存混合类型的数据.
  22.    */
  23.   public static void testNormal() {
  24.     System.out.println("----- testNormal -----------");
  25.     // Set有多个实现,我们先看看最常用的HashSet
  26.     Set set = new HashSet();
  27.     // 添加一个字符串
  28.     set.add("字符串");
  29.     // 添加一个整数对象
  30.     set.add(new Integer(1));
  31.     // 利用JDK5的特性,增加一个浮点数
  32.     set.add(123.45);
  33.     // 我们看看集合里对象的数量
  34.     System.out.println(set.size());
  35.     // 我们尝试增加一个重复的字符串
  36.     set.add("字符串");
  37.     // 我们再次看看集合里对象的数量
  38.     System.out.println(set.size());
  39.     // 我们来测试看看是否集合里包含了某个数据
  40.     System.out.println(set.contains(123.45));
  41.     // 我们从里面把这个浮点数删除
  42.     set.remove(123.45);
  43.     // 我们再次看看集合里对象的数量
  44.     System.out.println(set.size());
  45.   }
  46.   /**
  47.    * 专门针对HashSet的测试。
  48.    */
  49.   public static void testForHashSet() {
  50.     System.out.println("----- testForHashSet -----------");
  51.     HashSet<MyObject> set = new HashSet<MyObject>();
  52.     // 增加一个null对象
  53.     set.add(null);
  54.     // 我们再次看看集合里对象的数量
  55.     System.out.println(set.size());
  56.     // 再次增加一个null看看
  57.     set.add(null);
  58.     // 我们再次看看集合里对象的数量
  59.     System.out.println(set.size());
  60.     MyObject obj = new MyObject("java2000"2);
  61.     set.add(obj);
  62.     obj = new MyObject("csdn"10);
  63.     set.add(obj);
  64.     // 我们再次看看集合里对象的数量
  65.     System.out.println(set.size());
  66.     // 判断是否包含某个对象
  67.     System.out.println(set.contains(obj));
  68.     obj = new MyObject("java2000_net"2);
  69.     set.add(obj);
  70.     // 我们再次看看集合里对象的数量
  71.     System.out.println(set.size());
  72.     // 我们尝试把obj再次放入set看看
  73.     // 并没有增加,因为是重复的
  74.     set.add(obj);
  75.     System.out.println(set.size());
  76.     // 我们构造一个新的对象,内容和前面的相同
  77.     obj = new MyObject("java2000_net"2);
  78.     set.add(obj);
  79.     System.out.println(set.size());
  80.     // 我们修改一下obj里面的年龄,再看看
  81.     obj.setAge(3);
  82.     // 我们再测试看看是否包含此对象。
  83.     // 请注意,我们这个obj和前面的obj是同一个对象
  84.     // 我们仅仅修改了一下我们的年龄
  85.     System.out.println(set.contains(obj));
  86.     // 我们尝试把obj再次放入set看看
  87.     // 我们又增加了长度
  88.     set.add(obj);
  89.     System.out.println(set.size());
  90.   }
  91.   /**
  92.    * 专门针对HashSet的测试2。
  93.    */
  94.   public static void testForHashSet2() {
  95.     System.out.println("----- testForHashSet2 -----------");
  96.     HashSet<MyObject2> set = new HashSet<MyObject2>();
  97.     MyObject2 obj = null;
  98.     for (int i = 0; i < 3; i++) {
  99.       obj = new MyObject2("java2000" + i, i);
  100.       set.add(obj);
  101.       System.out.println(set.size());
  102.     }
  103.   }
  104. }
  105. class MyObject {
  106.   private int age;
  107.   private String name;
  108.   public int getAge() {
  109.     return age;
  110.   }
  111.   public void setAge(int age) {
  112.     this.age = age;
  113.   }
  114.   public String getName() {
  115.     return name;
  116.   }
  117.   public void setName(String name) {
  118.     this.name = name;
  119.   }
  120.   MyObject(String name, int age) {
  121.     this.name = name;
  122.     this.age = age;
  123.   }
  124.   public boolean equals(Object obj) {
  125.     System.out.println("equals");
  126.     if (obj == null || !(obj instanceof MyObject)) {
  127.       return false;
  128.     }
  129.     MyObject o = (MyObject) obj;
  130.     return this.age == o.age && this.name.equals(o.name);
  131.   }
  132.   public int hashCode() {
  133.     int hashCode = name.hashCode() + String.valueOf(age).hashCode();
  134.     return hashCode;
  135.   }
  136. }
  137. class MyObject2 {
  138.   private int age;
  139.   private String name;
  140.   public int getAge() {
  141.     return age;
  142.   }
  143.   public void setAge(int age) {
  144.     this.age = age;
  145.   }
  146.   public String getName() {
  147.     return name;
  148.   }
  149.   public void setName(String name) {
  150.     this.name = name;
  151.   }
  152.   MyObject2(String name, int age) {
  153.     this.name = name;
  154.     this.age = age;
  155.   }
  156.   public boolean equals(Object obj) {
  157.     System.out.println("equals");
  158.     if (obj == null || !(obj instanceof MyObject2)) {
  159.       return false;
  160.     }
  161.     MyObject2 o = (MyObject2) obj;
  162.     return this.age == o.age && this.name.equals(o.name);
  163.   }
  164.   public int hashCode() {
  165.     return 1;
  166.   }
  167. }
  168. class MyObject3 {
  169.   private int age;
  170.   private String name;
  171.   // 采用一个变量进行控制
  172.   // 一旦生成了hashCode,则不再变动
  173.   private int HASHCODE = Integer.MIN_VALUE;
  174.   public int hashCode() {
  175.     if (HASHCODE == Integer.MIN_VALUE) {
  176.       // 重新生成本类的hashCode
  177.       HASHCODE = name.hashCode() + String.valueOf(age).hashCode();
  178.     }
  179.     return HASHCODE;
  180.   }
  181. }

原创 老紫竹JAVA提高教程(2)-认识Set集合之HashSet收藏









新一篇: 济南的初冬,近几年首次在外面单独过周末 | 旧一篇: 老紫竹JAVA基础培训(11),方法的Override

<script></script> 原文地址:http://www.java2000.net/p11767

 集合在Java里面的作用非凡,我们常用的有Set,List和Map三种,我们先熟悉一下Set,特别是HashSet的使用
  1. package collection.lession2;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. /**
  5.  * 老紫竹JAVA提高教程(2)-认识Set集合之HashSet。<br>
  6.  * Set用来保存不允许重复的数据。可以是任何对象类型。<br>
  7.  * JDK5以后,主类型可以通过autobox 放入Set里面。
  8.  * 
  9.  * @author 老紫竹 JAVA世纪网(java2000.net)
  10.  * 
  11.  */
  12. public class Lession2 {
  13.   public static void main(String[] args) {
  14.     // 普通测试
  15.     testNormal();
  16.     // 测试HashSet的特殊性
  17.     testForHashSet();
  18.     testForHashSet2();
  19.   }
  20.   /**
  21.    * 测试保存混合类型的数据.
  22.    */
  23.   public static void testNormal() {
  24.     System.out.println("----- testNormal -----------");
  25.     // Set有多个实现,我们先看看最常用的HashSet
  26.     Set set = new HashSet();
  27.     // 添加一个字符串
  28.     set.add("字符串");
  29.     // 添加一个整数对象
  30.     set.add(new Integer(1));
  31.     // 利用JDK5的特性,增加一个浮点数
  32.     set.add(123.45);
  33.     // 我们看看集合里对象的数量
  34.     System.out.println(set.size());
  35.     // 我们尝试增加一个重复的字符串
  36.     set.add("字符串");
  37.     // 我们再次看看集合里对象的数量
  38.     System.out.println(set.size());
  39.     // 我们来测试看看是否集合里包含了某个数据
  40.     System.out.println(set.contains(123.45));
  41.     // 我们从里面把这个浮点数删除
  42.     set.remove(123.45);
  43.     // 我们再次看看集合里对象的数量
  44.     System.out.println(set.size());
  45.   }
  46.   /**
  47.    * 专门针对HashSet的测试。
  48.    */
  49.   public static void testForHashSet() {
  50.     System.out.println("----- testForHashSet -----------");
  51.     HashSet<MyObject> set = new HashSet<MyObject>();
  52.     // 增加一个null对象
  53.     set.add(null);
  54.     // 我们再次看看集合里对象的数量
  55.     System.out.println(set.size());
  56.     // 再次增加一个null看看
  57.     set.add(null);
  58.     // 我们再次看看集合里对象的数量
  59.     System.out.println(set.size());
  60.     MyObject obj = new MyObject("java2000"2);
  61.     set.add(obj);
  62.     obj = new MyObject("csdn"10);
  63.     set.add(obj);
  64.     // 我们再次看看集合里对象的数量
  65.     System.out.println(set.size());
  66.     // 判断是否包含某个对象
  67.     System.out.println(set.contains(obj));
  68.     obj = new MyObject("java2000_net"2);
  69.     set.add(obj);
  70.     // 我们再次看看集合里对象的数量
  71.     System.out.println(set.size());
  72.     // 我们尝试把obj再次放入set看看
  73.     // 并没有增加,因为是重复的
  74.     set.add(obj);
  75.     System.out.println(set.size());
  76.     // 我们构造一个新的对象,内容和前面的相同
  77.     obj = new MyObject("java2000_net"2);
  78.     set.add(obj);
  79.     System.out.println(set.size());
  80.     // 我们修改一下obj里面的年龄,再看看
  81.     obj.setAge(3);
  82.     // 我们再测试看看是否包含此对象。
  83.     // 请注意,我们这个obj和前面的obj是同一个对象
  84.     // 我们仅仅修改了一下我们的年龄
  85.     System.out.println(set.contains(obj));
  86.     // 我们尝试把obj再次放入set看看
  87.     // 我们又增加了长度
  88.     set.add(obj);
  89.     System.out.println(set.size());
  90.   }
  91.   /**
  92.    * 专门针对HashSet的测试2。
  93.    */
  94.   public static void testForHashSet2() {
  95.     System.out.println("----- testForHashSet2 -----------");
  96.     HashSet<MyObject2> set = new HashSet<MyObject2>();
  97.     MyObject2 obj = null;
  98.     for (int i = 0; i < 3; i++) {
  99.       obj = new MyObject2("java2000" + i, i);
  100.       set.add(obj);
  101.       System.out.println(set.size());
  102.     }
  103.   }
  104. }
  105. class MyObject {
  106.   private int age;
  107.   private String name;
  108.   public int getAge() {
  109.     return age;
  110.   }
  111.   public void setAge(int age) {
  112.     this.age = age;
  113.   }
  114.   public String getName() {
  115.     return name;
  116.   }
  117.   public void setName(String name) {
  118.     this.name = name;
  119.   }
  120.   MyObject(String name, int age) {
  121.     this.name = name;
  122.     this.age = age;
  123.   }
  124.   public boolean equals(Object obj) {
  125.     System.out.println("equals");
  126.     if (obj == null || !(obj instanceof MyObject)) {
  127.       return false;
  128.     }
  129.     MyObject o = (MyObject) obj;
  130.     return this.age == o.age && this.name.equals(o.name);
  131.   }
  132.   public int hashCode() {
  133.     int hashCode = name.hashCode() + String.valueOf(age).hashCode();
  134.     return hashCode;
  135.   }
  136. }
  137. class MyObject2 {
  138.   private int age;
  139.   private String name;
  140.   public int getAge() {
  141.     return age;
  142.   }
  143.   public void setAge(int age) {
  144.     this.age = age;
  145.   }
  146.   public String getName() {
  147.     return name;
  148.   }
  149.   public void setName(String name) {
  150.     this.name = name;
  151.   }
  152.   MyObject2(String name, int age) {
  153.     this.name = name;
  154.     this.age = age;
  155.   }
  156.   public boolean equals(Object obj) {
  157.     System.out.println("equals");
  158.     if (obj == null || !(obj instanceof MyObject2)) {
  159.       return false;
  160.     }
  161.     MyObject2 o = (MyObject2) obj;
  162.     return this.age == o.age && this.name.equals(o.name);
  163.   }
  164.   public int hashCode() {
  165.     return 1;
  166.   }
  167. }
  168. class MyObject3 {
  169.   private int age;
  170.   private String name;
  171.   // 采用一个变量进行控制
  172.   // 一旦生成了hashCode,则不再变动
  173.   private int HASHCODE = Integer.MIN_VALUE;
  174.   public int hashCode() {
  175.     if (HASHCODE == Integer.MIN_VALUE) {
  176.       // 重新生成本类的hashCode
  177.       HASHCODE = name.hashCode() + String.valueOf(age).hashCode();
  178.     }
  179.     return HASHCODE;
  180.   }
  181. }
说明,针对HashSet:
  • Set不允许重复
  • 允许 null,重复的null只算一个
  • 判断是否存在一个数据(是否重复),先判断其hashCode是否存在,若存在再逐个判断hashCode相同的数据是否相等
  • 判断是否相等,除了hashCode相等外,还要判断对象引用相等(==),或者 equals
  • 如果一个对象的hashCode变动了,会造成找不到这个对象,也就出现了内存泄漏的危险。
hashCode 方法是HashSet里面对象的关键,它的算法影响到了数据的分散和查找效率。某个确认对象的hashCode不应该变动,避免出现内存泄漏,可以采用如下方法,来方式属性变化造成hashCode变化

分享到:
评论

相关推荐

    hashset类的使用

    这个是关于java语言的hashset集合类的一些基本用法和详解了个方法的使用

    HashSet类的用法.pdf

    HashSetHashSetHashSetHashSetHashSetHashSetHashSetHashSetHashSet

    java集合-HashSet的使用

    HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了...非线程安全:HashSet 类本身不是线程安全的,在多线程环境下需要进行外部同步操作,或者使用 Collections.synchronizedSet 方法封装成线程安全的集合。

    Java中的HashSet详解和使用示例_动力节点Java学院整理

    HashSet 是一个没有重复元素的集合。接下来通过实例代码给大家介绍java中的hashset相关知识,感兴趣的朋友一起看看吧

    HashSet和TreeSet使用方法的区别解析

    主要介绍了HashSet和TreeSet使用方法的区别解析,具有一定借鉴价值,需要的朋友可以参考下

    java中set、list和map的使用方法实例

    // GOF给出的定义为:提供一种方法访问一个容器(container)对象中的各个元素, // 而又不需暴露该对象的内部细节。 // 学习set对象容器的使用 // set容器中的对象不允许重复 // set容器接口的实现类有HashSet和 ...

    HashSet和HashMap的区别_动力节点Java学院整理

    什么是HashSet? HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写...如果我们没有重写这两个方法,将会使用这个方法的默认实现。。

    List 去重的6种方法(contains、迭代、hashSet、treeSet、linkedHashSet、stream)

    1:contains判断去重(有序) 此方法的优点的:理解起来比较简单,并且最终得到的集合也是有序...Stream 实现去重功能和其他方法不同的是,它不用新创建集合,使用自身接收一个去重的结果就可以了,并且实现代码也很简洁

    HashMap 和 HashSet的区别

    本文主要介绍HashMap 和 HashSet的区别,这里整理了详细的资料来说名两者的区别,并说明如何使用该方法,有需要的小伙伴可以参考下

    Java数据存储类型ArrayList、HashSet、HashMap、LinkedList使用不同遍历方法效率研究By Python

    Java不同数据存储类型使用不同遍历方法效率研究 GitHub代码仓库 数据存储类型 ArrayList HashSet HashMap LinkedList 遍历方法 传统遍历方法 for(int i=0;i&lt;list.size();i++) { String str = list.get(i); ... ...

    linked_hash_set-具有插入顺序的HashSet-Rust开发

    linked_hash_set此库基于元素的插入顺序提供了具有可预测迭代顺序的哈希...与std HashSet的比较常规用法与传统的哈希集非常相似,但是此结构还保持插入顺序。 与HashSet相比,LinkedHashSet使用一个附加的双向链表运行

    大厂真题之阿里云-Java实习生

    HashSet 中的 add ()方法会使用 HashMap 的 add ()方法。以下是 HashSet 部分源码: HashMap 的 key 是唯一的,由上面的代码可以看出 HashSet 添加进去的值就是作为 HashMap 的key。所以不会 重复( HashMap 比较...

    求2个集合的交集

    TrimExcess 方法 将HashSet对象的容量设置为它所包含的元素的实际个数,向上舍入为接近的特性与实现的值。 UnionWith 方法 修改当前的HashSet对象,以包含该对象本身和指定集合中存在的所有元素 给个简单的例子...

    java技术文档 常用类和经典应用

    HashSet类的用法.pdf Hashtable类的用法.pdf Java语言基础.pdf Math类的常用方法.pdf String与StringBuffer.pdf Vector类的用法.pdf 迭代器Iterator的用法.pdf 反射机制.pdf 访问路经问题.pdf 基于MVC和RMI的分布....

    Java基础知识.doc

    就不能修改这个对象中的那些参与计算哈希值的字段了,否则,对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为的参数去HashSet集合中检索...

    链表去重内容介绍.zip

    这种方法的核心思想是使用一个哈希表(在Java中是HashSet)来存储已经访问过的元素。遍历链表,对于每个元素,检查它是否已经在哈希表中。如果不在,将其添加到哈希表中,并保留在链表中;如果已存在,说明是重复...

    java集合知识-map、set等

    记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果自定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。 建立对象判断是否相同的依据。...

    去除链表重复元素-Java 实现

    在Java中,去除单链表中的重复元素可以通过使用哈希集合(HashSet)来实现,该集合用于存储已经遍历过的元素。在遍历链表的过程中,我们将每个元素与集合中的元素进行比较,如果发现重复,则删除链表中的该元素。 ...

    C#使用foreach语句遍历集合类型的方法

    本文实例讲述了C#使用foreach语句遍历集合类型的方法。分享给大家供大家参考。具体如下: 这里演示如何实现可与 foreach 语句一起使用的集合类 using System; using System.Collections; public class Tokens: ...

Global site tag (gtag.js) - Google Analytics