• java Set(集合)


    set不保存重复的元素(至于如何判断元素相同则较为复杂,后面将会看到).Set中最常被使用的是测试归属表,你可以很容易地询问某个对象是否在某个Set中,正因如此,查找就成了Set最重要的操作,因此通常会选择一个HashSet的实现,它专门对快速查找进行了优化.

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

    通用set类型: HashSet LinkedHashSet

    java Set类

    package java.util;
    public interface Set<E> extends Collection<E> {
        int size();                //输出集合大小
       boolean isEmpty();         //判空
       boolean contains(Object o);//检查集合中是否包含对象o
       Iterator<E> iterator(); //迭代器
       Object[] toArray();
       <T> T[] toArray(T[] a);
        boolean add(E e);       //添加一个元素e
       boolean remove(Object o); //移除对象o
       boolean containsAll(Collection<?> c); //检查集合中是否包含集合C的所有元素
        boolean addAll(Collection<? extends E> c); //添加集合c的所有元素
        boolean retainAll(Collection<?> c);        //保留本集合和集合c的差集
        boolean removeAll(Collection<?> c);       //移除集合中和集合c相同的元素
       void clear();  //清除所有element
       boolean equals(Object o);  //当hashCode()方法返回的哈希码有重复时,调用Object方法
       int hashCode(); //添加元素时,首先调用本方法返回哈希码,如果没重复则添加到集合,否则调用equals()方法返回的哈希码有重复时
                       //哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上
       @Override
        default Spliterator<E> spliterator() {  //splitable iterator可分割迭代器
            return Spliterators.spliterator(this, Spliterator.DISTINCT);
        }
    }

    HashSet示例

    //一个HashSet的示例
    //
    : holding/SetOfInteger.java package object; import java.util.*; public class SetOfInteger { public static void main(String[] args) { Random rand = new Random(new Date().getTime()); Set<Integer> intset = new HashSet<Integer>(); for(int i = 0; i < 10000; i++) intset.add(rand.nextInt(30)); System.out.println(intset);//0~29之间的数出现了10000次但每一个数只有一个出现在结果中 } } /* 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或LinkedSet都不同,因为它们的实现具有不同的元素存储方式,TreeSet将元素存储在红--黑树数据结构中,而HashSet使用了散列函数,LinkedSet出于速度原因也使用了散列,但看起来它使用了链表来维护元素的插入顺序

    用HashSet一般没有规律可循,如果相对结果排序可以使用TreeSet代替HashSet

    能产生每个元素都唯一的列表是相当有用的功能,例如,要找出SetOperatoration.java文件中所有的单词的时候,通过编程思想的net.mindview.TextFile工具,可以打开一个文件,并将其放入Set中:

    //: holding/UniqueWords.java
    package object;
    import java.util.*;
    //import net.mindview.util.*;
    
    public class UniqueWords {
      public static void main(String[] args) {
        Set<String> words = new TreeSet<String>(
          new TextFile("src/object/SetOperations.java", "\W+"));//"\W+"为正则表达式,表示"一个或多个字母"
    //TreeSet是按字典排序的,因此大小字母和小写字母被放到了不同的组中
    System.out.println(words); } } /* Output: [A, B, C, Collections, D, E, F, G, H, HashSet, I, J, K, L, M, N, Output, Print, Set, SetOperations, String, X, Y, Z, add, addAll, added, args, class, contains, containsAll, false, from, holding, import, in, java, main, mindview, net, new, print, public, remove, removeAll, removed, set1, set2, split, static, to, true, util, void] *///:~

    如果想按照字母顺序排序,那么可以向TreeSet的构造其中传入String.CASE_INSENTIVE_ORDER比较器(比较器是建立排序顺序的对象)

    //: holding/UniqueWordsAlphabetic.java
    // Producing an alphabetic listing.
    package object;
    import java.util.*;
    //import net.mindview.util.*;
    
    public class UniqueWordsAlphabetic {
      public static void main(String[] args) {
        Set<String> words =
          new TreeSet<String>(String.CASE_INSENSITIVE_ORDER);//CASE_INSENSITIVE_ORDER比较器(比较器是建立排序顺序的对象
        words.addAll(
          new TextFile("src/object/SetOperations.java", "\W+"));
        System.out.println(words);
      }
    } /* Output:
    [A, add, addAll, added, args, B, C, class, Collections, contains, containsAll, D, E, F, false, from, G, H, HashSet, holding, I, import, in, J, java, K, L, M, main, mindview, N, net, new, Output, Print, public, remove, removeAll, removed, Set, set1, set2, SetOperations, split, static, String, to, true, util, void, X, Y, Z]
    *///:~
  • 相关阅读:
    I40E网卡BUG引起内核异常重启问题分析
    Linux rp_filter配置引起的组播断流问题
    【原创】Intel XL710网卡异常Reset问题复现
    【原创】qlogic网卡软中断不均衡问题分析
    【原创】控制perl和python脚本执行过程中脚本文件是否关闭的方法
    Linux内核d_path函数应用的经验总结
    Intel 82599网卡异常挂死原因
    用slub_track调试use after free问题
    如何获取内核指定线程的调用栈
    使用data breakpoint 追踪地址寄存器被修改的问题
  • 原文地址:https://www.cnblogs.com/jiangfeilong/p/10261452.html
Copyright © 2020-2023  润新知