• java集合类(四)About Set


    接上篇:java集合类(三)About Iterator & Vector(Stack)

         之前,在比较java常见集合类的时候,就了解到一点有关Set的特性、实现类及其要求等,读者可以去温习下“java集合类(一)”。Set与Collection接口完全一样('cause 它继承了Collection接口---接口间继承,可以此拓展接口功能,另外,java只能通过接口实现多继承,而抽象类则不行),只是与Collection的行为不一样(多态性表现)。Set保存的是不重复元素,但不保证元素次序,它常被用来测试归属性,即通过对象的值,判断元素是否在某个Set集合内,通常使用HashSet实现,因为HashSet专门对快速查找进行了优化(hashCode()实现)。另外2种常见的Set,TreeSet则实现Comparable接口,以一定的方式对元素进行排序,并用红黑树存储这些元素;LinkedHashSet也使用了hashCode(),但它使用链表来维护元素顺序---即元素的插入顺序。这三者的比较可见下文!下面介绍Set的使用:

    • Talk about “Set”:
    All Superinterfaces:Collection<E>, Iterable<E> 
    All Known Subinterfaces:NavigableSet<E>, SortedSet<E>
    All Known Implementing Classes:AbstractSet, ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet
    1.Set 的常规使用:
    //demo from <Thinking in java>
    import java.util.*;
    
    public void setdemo(){
      Random r = new Random(30);
      Set<Integer> set = new HashSet<Integer>();
      for(int i = 0; i<10000; i++)
          set.add(r.nextInt(20));
      System.out.println(set);
    }
    /*output:
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 16, 19, 18]
    */
    

      上面实例只对add()进行,因为Set跟之前的Collection差不多,其他方法便不再一一演示。在上面代码中使用了Random进行对Set元素的添加,这里就顺便用Set实现“在特定范围内,确保每次产生不同的随机数”

    //Random 5 different nums between 10~100 every time
    
    import java.util.*;
    
    public void randomdemo(){
         HashSet<Integer> hs = new HashSet<Integer>();
         while (true) {
         int a = (int)(Math.random() * 100);
          if(a >= 10 && a <= 100) {
                 hs.add(a);
           }
          if (hs.size() == 5) {
    	      break;
    	 }
         }
         System.out.println(hs);
    }
    //output:[23, 97, 82, 41, 30]
    
    • 关于使用Set测试元素的归属性,主要采用的是contains()及其相关方法,用法跟其他前面提及的java集合类差不多,这里也不作实例演示。  
    • 三种常用Set实现类的比较:

    1)HashSet:  为快速查找而设计的set,存入HashSet的元素必须定义hashCode(),编程中一般使用这种(对元素顺序无要求时)

    2)TreeSet: 保持次序的Set,底层结构为红黑树,使用它可以从Set中提取有序序列,存入其中的元素必须实现Comparable接口

    3)LinkedHashSet:具有HashSet的查询速度,使用链表维护元素的顺序(即插入顺序),元素必须定义hashCode()

    注:关于hashCode(),以后有时间再跟读者详细讨论,现在只需知道:在这里,它是为快速查找而必须实现的方法!

    2.About SortedSet:

    All Superinterfaces:Collection<E>, Iterable<E>, Set<E>
    All Known Subinterfaces:NavigableSet<E>
    All Known Implementing Classes:ConcurrentSkipListSet, TreeSet
    • 有关SortedSet的方法:
      1)Comparator comparator():Returns the comparator used to order the elements in this set, or null if this set uses the natural ordering of its elements

            2)Object first():Returns the first (lowest) element currently in this set

            3)Object last():Returns the last (highest) element currently in this set

            4)SortedSet subSet(fromelement,toelement):

                                Returns a view of the portion of this set whose elements range from fromElement, inclusive, to toElement, exclusive

            5)SortedSet headSet(toelement):Returns a view of the portion of this set whose elements are strictly less than toElement

            6)SortedSet tailSet(fromelement):Returns a view of the portion of this set whose elements are greater than or equal to fromElement

    • SortedSet的示例:
    import java.util.*;
    
    public void sortedsetdemo(){
         SortedSet<String> sortedset = new TreeSet<String>();
         Collections.addAll(sortedset, "1 2 3 4 5".split(" "));
         System.out.println(sortedset);
         System.out.println(sortedset.first());
         System.out.println(sortedset.last());
         System.out.println(sortedset.subSet("1","4"));
         System.out.println(sortedset.headSet("3"));
         System.out.println(sortedset.tailSet("2"));
    } 

    输出:

    [1, 2, 3, 4, 5]
    1
    5
    [1, 2, 3]
    [1, 2]
    [2, 3, 4, 5]

       下一节学习“java集合类(五)About Map”!

    ###    学习从来都是一个过程,对对错错对对...若文中有错误,还望读者批评指出      ###

  • 相关阅读:
    学习WindowsPhone 2013/12/22
    spring-aop学习
    easymock+junit+spring学习·
    javaWeb实现文件上传与下载 (转)
    Java实现视频网站的视频上传、视频转码、视频关键帧抽图, 及视频播放功能
    jsp自定义标签
    listener监听器
    移植一个项目到本地的问题
    struts1拦截器
    eclipse开发 javafx(转)
  • 原文地址:https://www.cnblogs.com/allenpengyu/p/3463624.html
Copyright © 2020-2023  润新知