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

集合在Java里面的作用非凡,我们常用的有Set,List和Map三种,我们先熟悉一下Set ,特别是HashSet的使用

package collection.lession2;

import java.util.HashSet;
import java.util.Set;

/**
* 老紫竹JAVA提高教程(2)-认识Set集合之HashSet。<br>
* Set用来保存不允许重复的数据。可以是任何对象类型。<br>
* JDK5以后,主类型可以通过autobox 放入Set里面。
* 
* @author 老紫竹 JAVA世纪网(java2000.net)
* 
*/
public class Lession2 {

  public static void main(String[] args) {
   // 普通测试
   testNormal();

   // 测试HashSet的特殊性
   testForHashSet();
   testForHashSet2();
  }

  /**
  * 测试保存混合类型的数据.
  */
  public static void testNormal() {
   System.out.println("----- testNormal -----------");
   // Set有多个实现,我们先看看最常用的HashSet
   Set set = new HashSet();
   // 添加一个字符串
   set.add("字符串");
   // 添加一个整数对象
   set.add(new Integer(1));
   // 利用JDK5的特性,增加一个浮点数
   set.add(123.45);

   // 我们看看集合里对象的数量
   System.out.println(set.size());

   // 我们尝试增加一个重复的字符串
   set.add("字符串");

   // 我们再次看看集合里对象的数量
   System.out.println(set.size());

   // 我们来测试看看是否集合里包含了某个数据
   System.out.println(set.contains(123.45));

   // 我们从里面把这个浮点数删除
   set.remove(123.45);

   // 我们再次看看集合里对象的数量
   System.out.println(set.size());
  }

  /**
  * 专门针对HashSet的测试。
  */
  public static void testForHashSet() {
   System.out.println("----- testForHashSet -----------");
   HashSet<MyObject> set = new HashSet<MyObject>();

   // 增加一个null对象
   set.add(null);
   // 我们再次看看集合里对象的数量
   System.out.println(set.size());
   // 再次增加一个null看看
   set.add(null);
   // 我们再次看看集合里对象的数量
   System.out.println(set.size());

   MyObject obj = new MyObject("java2000", 2);
   set.add(obj);

   obj = new MyObject("csdn", 10);
   set.add(obj);

   // 我们再次看看集合里对象的数量
   System.out.println(set.size());

   // 判断是否包含某个对象
   System.out.println(set.contains(obj));

   obj = new MyObject("java2000_net", 2);
   set.add(obj);

   // 我们再次看看集合里对象的数量
   System.out.println(set.size());

   // 我们尝试把obj再次放入set看看
   // 并没有增加,因为是重复的
   set.add(obj);
   System.out.println(set.size());

   // 我们构造一个新的对象,内容和前面的相同
   obj = new MyObject("java2000_net", 2);
   set.add(obj);
   System.out.println(set.size());

   // 我们修改一下obj里面的年龄,再看看
   obj.setAge(3);

   // 我们再测试看看是否包含此对象。
   // 请注意,我们这个obj和前面的obj是同一个对象
   // 我们仅仅修改了一下我们的年龄
   System.out.println(set.contains(obj));

   // 我们尝试把obj再次放入set看看
   // 我们又增加了长度
   set.add(obj);
   System.out.println(set.size());
  }

  /**
  * 专门针对HashSet的测试2。
  */
  public static void testForHashSet2() {
   System.out.println("----- testForHashSet2 -----------");
   HashSet<MyObject2> set = new HashSet<MyObject2>();
   MyObject2 obj = null;
   for (int i = 0; i < 3; i++) {
    obj = new MyObject2("java2000" + i, i);
    set.add(obj);
    System.out.println(set.size());
   }
  }

}

class MyObject {
  private int age;
  private String name;

  public int getAge() {
   return age;
  }

  public void setAge(int age) {
   this.age = age;
  }

  public String getName() {
   return name;
  }

  public void setName(String name) {
   this.name = name;
  }

  MyObject(String name, int age) {
   this.name = name;
   this.age = age;
  }

  public boolean equals(Object obj) {
   System.out.println("equals");
   if (obj == null || !(obj instanceof MyObject)) {
    return false;
   }
   MyObject o = (MyObject) obj;
   return this.age == o.age && this.name.equals(o.name);
  }

  public int hashCode() {
   int hashCode = name.hashCode() + String.valueOf(age).hashCode();
   return hashCode;
  }
}

class MyObject2 {
  private int age;
  private String name;

  public int getAge() {
   return age;
  }

  public void setAge(int age) {
   this.age = age;
  }

  public String getName() {
   return name;
  }

  public void setName(String name) {
   this.name = name;
  }

  MyObject2(String name, int age) {
   this.name = name;
   this.age = age;
  }

  public boolean equals(Object obj) {
   System.out.println("equals");
   if (obj == null || !(obj instanceof MyObject2)) {
    return false;
   }
   MyObject2 o = (MyObject2) obj;
   return this.age == o.age && this.name.equals(o.name);
  }

  public int hashCode() {
   return 1;
  }
}

class MyObject3 {
  private int age;
  private String name;

  // 采用一个变量进行控制
  // 一旦生成了hashCode,则不再变动
  private int HASHCODE = Integer.MIN_VALUE;

  public int hashCode() {
   if (HASHCODE == Integer.MIN_VALUE) {
    // 重新生成本类的hashCode
    HASHCODE = name.hashCode() + String.valueOf(age).hashCode();

   }
   return HASHCODE;
  }
}

时间: 2024-12-03 05:16:33

JAVA提高教程(2)-认识Set集合之HashSet的相关文章

JAVA提高教程(5)-认识Set集合之EnumSet

这个类是1.5开始有的,目前个人使用量几乎为零,因为我很少使用枚举,呵呵.我这 里也是简单介绍一下而已.其使用方式和普通的Set没有区别,只是构造方法有一些特殊 的而已. 1.package collection.lession5; 2. 3.import java.util.Arrays; 4.import java.util.EnumSet; 5.import java.util.Set; 6. 7./** 8. * 老紫竹JAVA提高教程(5)-认识Set集合之EnumSet.<br>

JAVA提高教程(4)-认识Set集合之TreeSet

TreeSet 是用来进行集合排序的,请注意他和LinkedHashSet的区别. TreeSet是按照一定的规则,将加入到集合里面的数据进行排序,而LinkedHashSet是 严格按照你放入集合的顺序进行使用. 先看源代码 package collection.lession4; import java.util.Arrays; import java.util.Comparator; import java.util.Set; import java.util.TreeSet; /** *

JAVA提高教程(3)-认识Set集合之LinkedHashSet

有序的集合,就是LinkedList,内部通过双向链表实现,LinkedHashMap为基础. package collection.lession3; import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; /** * 老紫竹JAVA提高教程(3)-认识Set集合之LinkedHashSet.<br> * <br> * Link

JAVA提高教程(1)-认识Set集合

集合的基本介绍,全在代码里了.不同的实现,细节不同,使用时稍微注意点就行了 .幸好我们常用的就那么几个. package collection.lession1; import java.util.EnumSet; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; import java.util.TreeSet; /** * 老紫竹

JAVA提高教程(11)-认识Map

Map可以为某些数据提供快速查找功能,通过关键字(key)可以快速的得到对应的 Value,而不用像List那样需要大范围的遍历或特别的算法. 1. 源代码 1.import java.util.ArrayList; 2.import java.util.HashMap; 3.import java.util.HashSet; 4.import java.util.Iterator; 5.import java.util.List; 6.import java.util.Map; 7.impor

JAVA提高教程(8)-认识List列表之Vector

Vector和ArrayList的最大区别就是Vector的主要集合方法是线程同步的. 1.package collection.lession8; 2. 3.import java.util.Arrays; 4.import java.util.Collection; 5.import java.util.Enumeration; 6.import java.util.Iterator; 7.import java.util.List; 8.import java.util.Vector; 9

JAVA提高教程(6)-认识List列表

列表是很常用的数据结构,感觉比Map和Set用的频率要高一些吧,因为我经常用其返 回数据库的操作结果集 package collection.lession6; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Stack; import

JAVA提高教程(14)-认识Map之LinkedHashMap

Java基础及提高教程目录 Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序.此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表.此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序).注意,如果在映射中重新插入 键,则插入顺序不受影响.(如果在调用 m.put(k, v) 前 m.containsKey(k) 返回了 true,则调用时会将键 k 重新插入到映射 m 中.) 此实现可以让客户避免未指定的.由 HashMap(及

JAVA提高教程(13)-认识Map之Hashtable

这个类,在使用上和HashMap的区别不大,其方法都是同步的(Synchronized). 1.package collection.lession13; 2. 3.import java.util.Hashtable; 4. 5./** 6. * 老紫竹JAVA提高教程(13)-认识Map之Hashtable<br> 7. * 这个类继承自一个已经过期不推荐使用的Dictionary类<br> 8. * 目前均推荐实现Map接口<br> 9. * 10. * 11.