zoukankan      html  css  js  c++  java
  • 集合04_Set

    Set集合总览

    集合元素无序、不重复,三个实现类都是线程不安全的,最好在创建时通过Collections工具类的synchronizedSortedSet方法来包装Set集合,防止对set集合的意外非同步访问。

    HashSet类

    1. 底层数据结构是哈希表(是一个元素为链表的数组) 和红黑树,按Hash算法存储元素,具有很好的存取和查找性能
    2. 判断相等的标准是两个对象通过equals方法比较相等,并且两个对象的hashCode方法的返回值也相等
    3. 如果需要重写equals方法,则也需要重写hashCode方法,保证对象相等(HashMap也是)
    4. 核心要点如下:
      • 集合元素可以为null
      • 不保证迭代顺序
      • 初始容量影响迭代性能
      • 底层封装了HashMap,操作HashSet实际是操作HashMap
      • 使用HashMap的put方法,同时使用了==和equals方法判断键是否相等,仅修改了无用的value值,因此对相同元素根本没插入

    LinkedHashSet类

    1. 底层数据结构是哈希表和双向链表
    2. 根据元素的hashCode值决定存储位置,使用链表维护次序,以插入顺序保存,在迭代访问全部元素时有很好的性能
    3. 核心要点如下:
      • 集合元素可以为null
      • 保证迭代顺序
      • 迭代双向链表,初始容量不影响性能
      • 需要维护双向链表,性能略差于HashSet
      • 底层封装了HashMap和双向链表

    EnumSet类

    1. 元素为同类型的枚举值,有序,在内部以单位向量的形式存储,占内存小,运行效率好,尤其是进行批量操作时。
    2. 不允许加入null值,应该通过提供的类方法创建对象。

    TreeSet类

    1. 底层数据结构是红黑树(是一个自平衡的二叉树),集合元素按大小排序

    2. 判断相等的标准是通过compareTo方法比较返回0

    3. 核心要点如下:

      • 集合元素不允许为null
      • 由于每添加一个元素都要调用该对象的compareTo(Object obj)方法与集合中其他元素比较,所以TreeSet只能添加同一种类型的对象
      • 底层封装了TreeMap
    4. 提供多种方法,如:

      • Object first()
      • Object last()
      • Object lower(Object e)
    5. 利用lambda表达式定制排序

      import java.util.TreeSet;
      
      public class Customer {
      private String name;
      private int age;
      
      public Customer(int age) {
      	this.age = age;
      }
      
      public String toString() {
      	return "[Customer:" + age + "]";
      }
      public static void main(String[] args) {
      	TreeSet<Customer> tsCustomers = new TreeSet<>((o1,o2) -> {
      		Customer c1 = (Customer)o1;
      		Customer c2 = (Customer)o2;
      		return c1.age > c2.age ? -1
      				:c1.age < c2.age ? 1 : 0;
      	});
      	
      	tsCustomers.add(new Customer(10));
      	tsCustomers.add(new Customer(20));
      	System.out.println(tsCustomers);
      }
      }
      

    输出结果为:

  • 相关阅读:
    POJ 1681 Painter's Problem(高斯消元法)
    HDU 3530 Subsequence(单调队列)
    HDU 4302 Holedox Eating(优先队列或者线段树)
    POJ 2947 Widget Factory(高斯消元法,解模线性方程组)
    HDU 3635 Dragon Balls(并查集)
    HDU 4301 Divide Chocolate(找规律,DP)
    POJ 1753 Flip Game(高斯消元)
    POJ 3185 The Water Bowls(高斯消元)
    克琳:http://liyu.eu5.org
    WinDbg使用
  • 原文地址:https://www.cnblogs.com/pycrab/p/8933313.html
Copyright © 2011-2022 走看看