`
baobeituping
  • 浏览: 1068982 次
  • 性别: 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类的使用

    我们还演示了remove方法来删除一个元素,使用size方法获取了HashSet中元素的数量,并最终使用迭代器遍历了HashSet中的所有元素。 在实际应用中,HashSet因其存储元素的唯一性和对元素添加、删除、查询的高效性而...

    HashSet类的用法.pdf

    如果多个线程同时对一个`HashSet`进行修改操作,那么必须采取额外措施(如使用`synchronized`关键字或`Collections.synchronizedSet()`方法)来保证线程安全。 3. **允许一个null元素**:`HashSet`允许存在一个`null...

    HashSet的实现原理

    HashSet是通过HashMap来实现的,其底层使用HashMap来保存所有元素。这种实现方式让HashSet的操作非常简单高效,因为HashSet的大部分操作,包括添加元素、删除元素、检查元素是否存在等,都是直接调用HashMap的相关...

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

    HashSet是Java编程语言中的一种集合类...然而,在多线程环境下,为了保证线程安全,可以使用`Collections.synchronizedSet`方法来包装HashSet,或者考虑使用ConcurrentHashMap来构建一个线程安全的集合并实现类似功能。

    HashSet去重

    - **`HashSet`与`HashMap`的关系**:实际上,`HashSet`底层是使用`HashMap`实现的,`HashSet`中的元素实际上是`HashMap`的键(key),值(value)为一个固定的静态对象(`PRESENT`)。 #### 七、结论 通过上述分析可以...

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

    Java中的HashSet详解和使用示例 HashSet是Java中一个非常重要的集合类,它继承于AbstractSet,并实现了Set接口。HashSet的主要特点是没有重复元素的集合,它是通过HashMap实现的,不保证元素的顺序,而且HashSet...

    HashMap与HashTable和HashSet的区别

    - **排序**:如果需要排序的功能,可以选择使用`TreeSet`代替`HashSet`。 - **初始化**:初始化`HashSet`时可以指定初始容量,例如`new HashSet(17)`。 #### 五、总结 综上所述,`HashTable`、`HashMap`和`HashSet...

    Set用法及与List的区别

    我们以`HashSetDemo.java`为例,探讨HashSet的使用方法。 `HashSet`是Java中最常用的Set实现类,它基于哈希表(HashMap)实现,提供了快速的插入、删除和查找操作。以下是一些基本的HashSet用法: 1. **创建...

    java集合-HashSet的使用

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

    treemap treeset hashset hashmap 简要介绍

    对于`HashMap`,尽管`Student`类的`equals()`和`hashCode()`方法未正确实现,但是由于`HashMap`使用的是对象引用作为键,所以每个调用`put()`方法都会覆盖之前的值,最终`map`中只会有最后一个键值对。 综上所述,...

    c++用vector实现HashSet

    不过,在这个场景中,我们将探讨如何使用`std::vector`来模拟HashSet的行为。 `std::vector`是C++标准库中的动态数组,它允许我们在运行时调整大小。为了用`std::vector`实现HashSet,我们需要关注几个关键点:插入...

    集合类HashSet

    理解其内部机制和使用方法,对于编写高效的Java代码至关重要。在黑马程序员_毕向东_Java基础视频教程中,你可能会更详细地学习到关于HashSet的实现原理和实战技巧。通过观看相关视频和实践操作,可以加深对HashSet的...

    排序之HashSet和TreeSet的区别

    在Java编程语言中,集合框架是处理数据的重要组成部分,其中`...同时,源码阅读也是提升技能的好方法,通过查看`HashSet`和`TreeSet`的源码,可以更深入地了解它们的工作原理,这有助于优化代码并解决可能出现的问题。

    Java基础加强_ArrayList_HashSet的比较及Hashcode分析

    5. 使用场景:ArrayList适合需要按顺序访问元素的情况,HashSet适合需要快速查找、插入和删除且不关心顺序的场景。 在实际开发中,选择ArrayList还是HashSet应根据具体需求来决定。理解这两个数据结构的特点以及...

    源码解析jdk7.0集合:HashSet的底层实现原理.pdf

    HashSet作为Java集合框架中一个重要的非同步集合实现,它在JDK 7.0中的底层实现原理是基于...在使用HashSet时,应当注意其线程不安全的特性,同时为了保证元素的唯一性,应当合理地重写hashCode()和equals()方法。

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

    HashSet和TreeSet使用方法的区别解析 HashSet和TreeSet都是Java集合框架中的Set接口实现,用于存储不重复的元素。但是,它们在使用方法和实现机理上有很大的区别。 首先,从使用方法上讲,HashSet和TreeSet都可以...

    java 利用HashSet删除学生

    结合这些特性,HashSet适合在不需要保持元素插入顺序且需要快速查找和删除元素的场景下使用,比如在本例中删除学生。 总的来说,Java中的HashSet是处理无序、去重数据集的有效工具。在实际编程中,我们可以根据需求...

    集合的概念及应用和HashSet保证数据不重复的原理

    同时,源码分析也能帮助我们理解HashMap的扩容机制,以及为什么即使两个对象的hashCode相同,它们仍然可以在HashSet中区分(因为equals()方法的正确实现)。 工具在学习和使用集合框架时也扮演着重要角色。例如,...

    由HashSet谈重用

    `HashSet`内部使用了一个`HashMap`来存储元素,通过将每个元素映射到一个固定的虚拟值来实现。 ```java public class HashSet&lt;E&gt; extends AbstractSet&lt;E&gt; implements Set, Cloneable, java.io.Serializable { ...

    HashSet和TreeSet.doc

    4. 考虑线程安全,如果在多线程环境中使用,可以考虑使用并发集合,如 CopyOnWriteArraySet 或使用Collections.synchronizedSet() 封装 HashSet。 5. 在内存使用上,TreeSet 由于维护排序关系,可能会占用比 HashSet...

Global site tag (gtag.js) - Google Analytics