| 
 
| 第四讲     Set 一、概述
 Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
 |--HashSet:底层数据结构是哈希表。线程不同步。 保证元素唯一性的原理:判断元素的hashCode值是否相同。如果相同,还会继续判断元素的equals方法,是否为true。
 |--TreeSet:可以对Set集合中的元素进行排序。默认按照字母的自然排序。底层数据结构是二叉树。保证元素唯一性的依据:compareTo方法return 0。
 Set集合的功能和Collection是一致的。
 
 二、HasSet
 HashSet:线程不安全,存取速度快。
 可以通过元素的两个方法,hashCode和equals来完成保证元素唯一性。如果元素的HashCode值相同,才会判断equals是否为true。如果元素的hashCode值不同,不会调用equals。
 注意:HashSet对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法。
 示例:
 [java] view plaincopy
 /*
 往hashSet集合中存入自定对象
 姓名和年龄相同为同一个人,重复元素。去除重复元素
 思路:1、对人描述,将人的一些属性等封装进对象
 2、定义一个HashSet容器,存储人对象
 3、取出
 
 */
 import java.util.*;
 
 //人描述
 class Person
 {
 private String name;
 private int age;
 
 Person(String name,int age)
 {
 this.name=name;
 this.age=age;
 }
 
 public String getName()
 {
 return name;
 }
 
 public int getAge()
 {
 return age;
 }
 
 public boolean equals(Object obj)
 {
 if(!(obj instanceof Person))
 return false;
 Person p=(Person)obj;
 return this.name.equals(p.name)&&this.age==p.age;
 }
 
 public int hashCode()
 {
 return this.name.hashCode()+this.age;
 }
 }
 class  HashSetTest
 {
 public static void main(String[] args)
 {
 HashSet h=new HashSet();
 h.add(new Person("shenm",10));
 h.add(new Person("shenm2",6));
 h.add(new Person("shenm1",30));
 h.add(new Person("shenm0",10));
 h.add(new Person("shenm0",10));
 
 getOut(h);
 
 }
 
 //取出元素
 public static void getOut(HashSet h)
 {
 for (Iterator it=h.iterator(); it.hasNext(); )
 {
 Person p=(Person)it.next();
 sop(p.getName()+"..."+p.getAge());
 }
 }
 
 //打印
 public static void sop(Object obj)
 {
 System.out.println(obj);
 }
 }
 | 
 |