黑马程序员技术交流社区

标题: Set集合之HashSet和TreeSet [打印本页]

作者: xiaoxinxin003    时间: 2015-7-11 23:54
标题: Set集合之HashSet和TreeSet
HashSet:底层是哈希表。通过元素的两个方法:HashCode 和equals完成的。如果哈希值相同就判断equals
        ,如果哈希值不同则不会调用equals。(保证唯一性)
        对于判断元素是否存在,或者删除等操作,依赖的方法也是HashCode和equals方法。
        TreeSet:底层是二叉树。
代码实例:
  1. import java.util.*;
  2. class HashSetTest
  3. {
  4.         public static void sop(Object obj){
  5.         System.out.println(obj);
  6.         }
  7.         public static void main(String[] args){
  8.                 HashSet hs = new HashSet();
  9.                 hs.add(new Person("a1",11));
  10.                 hs.add(new Person("a1",11));
  11.                 hs.add(new Person("a3",13));
  12.                 hs.add(new Person("a4",14));
  13.                 Iterator it = hs.iterator();
  14.                 while (it.hasNext())
  15.                 {
  16.                         Person p = (Person)it.next();
  17.                         sop(p.getName()+"****"+p.getAge());
  18.                 }
  19.         }
  20. }//创建一个Person类
  21. class Person
  22. {
  23.         private String name;
  24.         private int age;
  25.         Person(String name,int age){
  26.                 this.name = name;
  27.                 this.age= age;
  28.         }
  29.         public int hashCode(){//为了尽量保证哈希值唯一性,age乘以一个数。
  30.         return name.hashCode()+age*37;
  31.         }//复写equals方法
  32.         public boolean equals(Object obj){
  33.         if(!obj instanceof Person)
  34.                 return false;
  35.         Person p = (Person)obj;
  36.         System.out.println(this.name+"***equals***"+p.name);
  37.         return this.name.equals(p.name)&&this.age==p.age;
  38.         }
  39.         public String getName(){
  40.                 return name;
  41.         }
  42.         public int getAge(){
  43.                 return age;
  44.         }
  45. }
复制代码



        下面介绍TreeSet:可以对set集合的元素进行排序(自然顺序ascii),
排序时,当主要条件相同时,一定要判断一下次要条件,底层是二叉树,
保证元素唯一的方法是compareTo和return 0。
代码演示:
  1. //演示存储学生对象,按照学生年龄进行排序。
  2. import java.util.*;
  3. class TreeSetTest
  4. {
  5.         public static void main(String [] args){
  6.                 TreeSet ts = new TreeSet();
  7.                 ts.add(new Student("lisi01",11));
  8.                 ts.add(new Student("lisi02",12));
  9.                 ts.add(new Student("lisi03",13));
  10.                 ts.add(new Student("lisi04",14));
  11.                 ts.add(new Student("lisi05",15));
  12.                 Iterator it = ts.iterator();
  13.                 while(it.hasNext()){
  14.                         Student stu = (Student)it.next();
  15.                         System.out.println(stu.getName()+"**********"+stu.getAge());
  16.                 }
  17.         }
  18. }
  19. class Student implements Comparable//该接口强制让学生类具有比较性
  20. {//不实现该接口就会抛出类型转换异常classCastException
  21.         private String name;
  22.         private int age;
  23.         Student(){
  24.                 this.name = name;
  25.                 this.age = age;
  26.         }
  27.         //需要覆盖比较方法compareTo
  28.         public int compareTo(Object obj){
  29.                 if(!(obj instanceof Student))
  30.                         throw new RuntimeException("不是学生类对象");
  31.                 Student s = (Student)obj;
  32.                 if(this.age>s.age)
  33.                         return 1;
  34.                 if(this.age==s.age)
  35.                 {//如果年龄相同,则比较名字
  36.                         return this.name.compareTo(s.name);       
  37.                 }
  38.                 return -1;
  39.         }
  40.         public String getName(){
  41.         return name;
  42.         }
  43.         public int getAge(){
  44.         return age;
  45.         }
  46. }
复制代码






作者: xiaoxinxin003    时间: 2015-7-11 23:55
跟着毕老师学java
作者: 新手ing    时间: 2015-7-12 08:58
赞。。。。
作者: 洋葱头头    时间: 2015-7-12 09:29
顶一个:)
作者: 禾叶青青    时间: 2015-7-12 09:54
不错,赞一个
作者: 杨基米德    时间: 2015-7-12 09:56
挺好~学习一下楼主~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2