Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 300|回复: 0

[集合学习]HashSet和TreeSet的使用

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-28 23:55:27 | 显示全部楼层 |阅读模式
    Set是java中一个不包含重复元素的collection。更正式地说,set 不包含满足 e1.equals(e2) 的元素对e1和e2,并且最多包含一个 null 元素。正如其名称所暗示的,此接口模仿了数学上的 set 抽象。   HashSet与TreeSet都是基于Set接口的实现类。其中TreeSet是Set的子接口SortedSet的实现类。Set接口及其子接口、实现类的结构如下所示:                  |――SortedSet接口――TreeSet实现类
    Set接口――|――HashSet实现类
                     |――LinkedHashSet实现类    HashSet实现Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。  
      
       
       

         
       

         
       
      
         HashSet为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。对此集合进行迭代所需的时间与 HashSet 实例的大小(元素的数量)和底层 HashMap 实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。HashSet的实现是不同步的。如果多个线程同时访问一个集合,而其中至少一个线程修改了该集合,那么它必须保持外部同步。 当需要向HashSet中放置元素时,应该为要存放到散列表的各个对象定义hashCode()和equals(); 例如:
    1. import java.util.HashSet;
    2. import java.util.Iterator;
    3. public class HashSetTest {
    4.    public static void main(String[] args){
    5.      HashSet hs=new HashSet();
    6.      /**//*hs.add("one");
    7.      hs.add("two");
    8.      hs.add("three");
    9.      hs.add("four");*/
    10.      hs.add(new Student(1,"zhangsan"));
    11.      hs.add(new Student(2,"lishi"));
    12.      hs.add(new Student(3,"wangwu"));
    13.      hs.add(new Student(1,"zhangsan"));
    14.                
    15.      Iterator it=hs.iterator();
    16.      while(it.hasNext()){
    17.         System.out.println(it.next());
    18.      }
    19.    }
    20. }
    21. class Student //HashSet要重写hashCode和equals方法
    22. {
    23.    int num;
    24.    String name;
    25.    Student(int num,String name) {
    26.       this.num=num;
    27.       this.name=name;
    28.    }
    29.    public String toString(){
    30.         return "num :"+num+" name:"+name;
    31.    }
    32.    public int hashCode() {
    33.       return num*name.hashCode();
    34.    }
    35.   public boolean equals(Object o){
    36.      Student s=(Student)o;
    37.      return num==s.num && name.equals(s.name);
    38.   }
    39. }
    复制代码
    运行:
    D:java>java HashSetTest
    num :1 name:zhangsan
    num :3 name:wangwu
    num :2 name:lishi

       TreeSet类实现Set接口,该接口由TreeMap 实例支持。此类保证排序后的se 按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序进行排序,或按照在创建set时所提供的比较器进行排序。是一个有序集合,元素中安升序排序,缺省是按照自然顺序进行排序,意味着TreeSet中元素要实现Comparable接口;我们可以构造TreeSet对象时,传递实现了Comparator接口的比较器对象. 例如:
    1. import java.util.*;
    2. public class TreeSetTest {
    3.     public static void main(String[] args)
    4.     {
    5.        //TreeSet ts=new TreeSet();
    6.        TreeSet ts=new TreeSet(new Students.compareToStudent());
    7.        ts.add(new Students(2,"zhangshan"));
    8.        ts.add(new Students(3,"lishi"));
    9.        ts.add(new Students(1,"wangwu"));
    10.        ts.add(new Students(4,"maliu"));
    11.                
    12.      Iterator it=ts.iterator();
    13.       while(it.hasNext())
    14.        {
    15.           System.out.println(it.next());
    16.        }               
    17.     }
    18. }
    19. class Students implements Comparable
    20. {
    21.     int num;
    22.     String name;
    23.    Students(int num,String name)
    24.    {
    25.      this.num=num;
    26.      this.name=name;
    27.    }
    28.    static class compareToStudent implements Comparator //定义一个内部类来实现比较器
    29.    {
    30.       public int compare(Object o1, Object o2) {
    31.         Students s1=(Students)o1;
    32.         Students s2=(Students)o2;
    33.         int rulst= s1.num > s2.num ? 1 : (s1.num==s2.num ? 0 :-1);
    34.         if(rulst==0)
    35.           {
    36.            rulst=s1.name.compareTo(s2.name);
    37.           }               
    38.          return rulst;
    39.      }               
    40.    }
    41.          
    42.    public int compareTo(Object o)                 //写具体的比较方法
    43.    {
    44.      int result;
    45.      Students s=(Students)o;
    46.      result=num >s.num ? 1:(num==s.num ? 0 : -1);
    47.      if(result==0)
    48.      {
    49.         result=name.compareTo(s.name);
    50.      }
    51.        return result;
    52.    }

    53.   public String toString()
    54.    {
    55.        return num+":"+name;
    56.    }
    57. }
    复制代码
    运行:
    D:java>java TreeSetTest
    1:wangwu
    2:zhangshan
    3:lishi
    4:maliu

         HashSet是基于Hash算法实现的,其性能通常优于TreeSet,我们通常都应该使用HashSet,在我们需要排序的功能时,我门才使用TreeSet; compareTo这个方法,当等于的时候就返回0,当大于就返回1,当小于就返回-1,就这么简单。 TreeSet类型是J2SE中唯一可实现自动排序的类型,用法如下:
    1. import java.util.Comparator;
    2. import java.util.Iterator;
    3. import java.util.TreeSet;
    4. class MyComparator< T> implements Comparator< T> {
    5.     public int compare(T arg0, T arg1) {
    6.         if (arg0.equals(arg1)) {
    7.             return 0;
    8.         }
    9.         return ((Comparable< T>) arg0).compareTo(arg1) * -1;
    10.     }
    11. }
    12. public class TreeSetTest1 {
    13.     /** *//**
    14.      * @param args
    15.      */
    16.     public static void main(String[] args) {
    17.         MyComparator< String> myComparator = new MyComparator< String>();
    18.         // /////////////////////不添加自定义排序
    19.         TreeSet< String> treeSet1 = new TreeSet< String>();
    20.         treeSet1.add("c");
    21.         treeSet1.add("a");
    22.         treeSet1.add("b");
    23.         Iterator< String> iterator1 = treeSet1.iterator();
    24.         while (iterator1.hasNext()) {
    25.             System.out.println(iterator1.next());
    26.         }
    27.         // /////////////////////添加自定义排序
    28.         TreeSet< String> treeSet2 = new TreeSet< String>(myComparator);
    29.         treeSet2.add("c");
    30.         treeSet2.add("a");
    31.         treeSet2.add("b");
    32.         Iterator< String> iterator2 = treeSet2.iterator();
    33.         while (iterator2.hasNext()) {
    34.             System.out.println(iterator2.next());
    35.         }
    36.     }
    37. }
    复制代码
    运行结果:
    a
    b
    c
    c
    b
    a


      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://file.javaxxz.com/2014/10/28/235526703.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-6-15 17:51 , Processed in 0.391243 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表