`
逆风的香1314
  • 浏览: 1399746 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
原文地址: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变化
  1. class MyObject3 {
  2.   private int age;
  3.   private String name;
  4.   // 采用一个变量进行控制
  5.   // 一旦生成了hashCode,则不再变动
  6.   private int HASHCODE = Integer.MIN_VALUE;
  7.   public int hashCode() {
  8.     if (HASHCODE == Integer.MIN_VALUE) {
  9.       // 重新生成本类的hashCode
  10.       HASHCODE = name.hashCode() + String.valueOf(age).hashCode();
  11.     }
  12.     return HASHCODE;
  13.   }
  14. }

分享到:
评论

相关推荐

    day18-集合-中(HashSet&TreeSet&比较器).zip

    day18-集合-中(HashSet&TreeSet&比较器).zip

    java集合知识-map、set等

    例子2-2 package test; import java.util.HashSet; import java.util.Iterator; //package cn.itcast.p.bean; class Person /*extends Object*/// implements Comparable { private String name; private int...

    java集合-HashSet的使用

    HashSet 是 Java 中的一个集合类,它实现了 Set 接口并提供了基于哈希表的无序、不重复元素的集合。具体来说,它是通过哈希表(实际上是一个 HashMap 实例)来存储元素的。 以下是 HashSet 的一些主要特点: 无序...

    Java集合类List-Set-Map的区别和联系.doc

    Java 集合类 List-Set-Map 的区别和联系 Java 集合类 List、Set 和 Map 是 Java 语言中最基本的集合类,它们之间存在着紧密的联系和区别。在本文中,我们将对 Java 集合类 List、Set 和 Map 的区别和联系进行详细的...

    java HashSet 集合排序

    java HashSet 集合排序,需要通过利用TreeSet集合排序。2013-10-30。

    集合类HashSet

    在Java编程语言中,集合类是用于存储一组...在黑马程序员_毕向东_Java基础视频教程中,你可能会更详细地学习到关于HashSet的实现原理和实战技巧。通过观看相关视频和实践操作,可以加深对HashSet的理解,提升编程能力。

    计算机后端-Java-Java核心基础-第24章 集合01 22. HashSet中元素的添加过程.avi

    计算机后端-Java-Java核心基础-第24章 集合01 22. HashSet中元素的添加过程.avi

    java 集合(list-queue-set)学习

    Java集合框架是Java编程语言中的一个重要组成部分,它提供了一种高效、灵活地管理对象的方式。在Java中,集合主要分为两大接口:...了解并熟练掌握这些集合的特性和使用场景,对于提高Java编程效率和代码质量至关重要。

    Java 2入门教程--Java

    Java 2 入门教程是针对初学者设计的教育资源,旨在帮助新手快速理解并掌握Java编程的基本概念和技能,从而具备初步的软件开发能力。Java作为一种广泛应用的编程语言,广泛应用于桌面应用、移动应用(尤其是Android...

    java基础教程-----清华专家强力推荐的教程

    Java基础教程是编程初学者踏入Java世界的敲门砖,由清华大学的专家精心打造,旨在提供一个全面而深入的Java学习平台。本教程涵盖了Java语言的基础概念,编程理念以及实际应用,帮助学习者从零开始逐步掌握这门强大的...

    Java的教程课件--入门必备

    8. **集合框架**:Java集合框架包括接口(如List、Set、Queue)和实现类(如ArrayList、LinkedList、HashSet、HashMap等),它们用于存储和管理对象。 9. **多线程**:Java内置了对多线程的支持,可以创建Thread...

    java基础知识学习教程-9集合与泛型.pptx

    Java基础知识学习教程-9集合与泛型 Java集合框架是Java语言中的一种数据结构,用于存储和操作数据。集合框架提供了多种类型的集合,包括Collection、Set、List、Queue、Map等。这些集合类型都继承自Collection接口...

    JAVA2实用教程-2

    《JAVA2实用教程-2》是一份全面深入的Java学习资料,旨在帮助初学者和有一定基础的开发者提升Java技能。这份教程涵盖了从基础知识到高级应用的广泛内容,以循序渐进的方式进行讲解,确保学习者能够逐步掌握Java编程...

    Java基础教程PPT-详细全面值得您下载

    8. **集合框架**:讲解List(ArrayList和LinkedList)、Set(HashSet和TreeSet)和Map(HashMap和TreeMap)接口及其实现类的基本用法。 9. **IO流**:介绍输入输出流的概念,包括字节流(InputStream和OutputStream...

    Java 2简明教程-第2版 电子课件 源代码

    Java 2简明教程-第2版是一本深入浅出的Java编程学习资源,适合初学者和有一定经验的开发者。这个教程以电子课件的形式呈现,结合源代码,提供了丰富的学习材料,帮助读者掌握Java语言的核心概念和技术。下面将详细...

    JavaSE专题-Set集合.doc

    Set集合是JavaSE中的一种重要数据结构,主要包括HashSet、TreeSet和LinkedHashSet三个子类。下面我们将对Set集合的原理、特点、使用场景等进行详细的探索和分析。 HashSet HashSet是Set集合中的一种重要实现类,...

    java集合类详解(set list ArrayList等java集合类详述)

    Java 集合类详解 Java 集合类是 Java 语言中的一种基本数据结构,用于存储和操作大量数据。集合类可以分为三大类:Collection、List 和 Set。 Collection 是集合框架中的根接口,提供了基本的集合操作,如 add、...

    Java教程5-8第二部分

    2. **数组与集合框架**:Java中的数组用于存储同类型的多个元素,而集合框架如ArrayList、LinkedList、HashSet和HashMap等提供了更灵活的数据结构,适合处理动态数据。 3. **异常处理**:学习如何使用try-catch-...

Global site tag (gtag.js) - Google Analytics