美文网首页
Set集合(学习Java编程思想)

Set集合(学习Java编程思想)

作者: 998584f56259 | 来源:发表于2016-10-25 13:54 被阅读32次

    Set不保存重复的元素。Set中最常见的操作时测试归属性,你可以很容易的查询到某个对象是否在某个Set中。正因为如此,查找就成为了Set中最常见的最重要的操作,因此你通常都会选择一个HashSet的实现,它专门对快速查找进行了优化。

    Set具有与Collection完全一样的接口,因此没有额外的功能,不像前面又两个不同的List。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set是基于对象的值来确定归属性的。

    import java.util.*;
    
    public class SetOfInteger {
    public static void main(String[] args) {
      
    Random rand = new Random(47);
    
    Set<Integer> intset = new HashSet<Integer>();
    
    for(int i = 0; i < 10000; i++)
      intset.add(rand.nextInt(30));
    
    System.out.println(intset);
    }
    } /* Output:
    [15, 8, 23, 16, 7, 22, 9, 21, 6, 1, 29, 14, 24, 4, 19, 26, 11, 18, 3, 12, 27, 17, 2, 13, 28, 20, 25, 10, 5, 0]
    *///:~
    

    你可以看到,上面例子输出的顺序没有任何规律,这是因为出于速度的因素考虑,HashSet使用了散列。HashSet所维护的顺序与TreeSet或LinkedHashSet都不同,因为它们的实现具有不同的元素存储方式。TreeSet将元素存储在红--黑树数据结构中,而HashSet使用的是散列函数。LinkedHashSet因为查询速度的原因也是用了散列,但是看起来他使用了链表来维护元素的插入顺序。

    import java.util.*;
    
    public class SortedSetOfInteger {
    public static void main(String[] args) {
    Random rand = new Random(47);
    SortedSet<Integer> intset = new TreeSet<Integer>();
    for(int i = 0; i < 10000; i++)
      intset.add(rand.nextInt(30));
    System.out.println(intset);
    }
    } /* Output:
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]
    *///:~
    

    你执行的最常见的操作之一,就是使用contains()测试Set的归属性。

    import java.util.*;
    
    public class SetOperations {
    public static void main(String[] args) {
    Set<String> set1 = new HashSet<String>();
    
    Collections.addAll(set1,
      "A B C D E F G H I J K L".split(" "));
    
    set1.add("M");
    
    System.out.println("H: " + set1.contains("H"));
    
    System.out.println("N: " + set1.contains("N"));
    
    Set<String> set2 = new HashSet<String>();
    Collections.addAll(set2, "H I J K L".split(" "));
    
    System.out.println("set2 in set1: " + set1.containsAll(set2));
    set1.remove("H");
    System.out.println("set1: " + set1);
    System.out.println("set2 in set1: " + set1.containsAll(set2));
    set1.removeAll(set2);
    System.out.println("set2 removed from set1: " + set1);
    Collections.addAll(set1, "X Y Z".split(" "));
    System.out.println("'X Y Z' added to set1: " + set1);
    }
    } /* Output:
    H: true
    N: false
    set2 in set1: true
    set1: [D, K, C, B, L, G, I, M, A, F, J, E]
    set2 in set1: false
    set2 removed from set1: [D, C, B, G, M, A, F, E]
    'X Y Z' added to set1: [Z, D, C, B, G, M, A, F, Y, X, E]
    *///:~

    相关文章

      网友评论

          本文标题:Set集合(学习Java编程思想)

          本文链接:https://www.haomeiwen.com/subject/rwuruttx.html