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);
      }
      }
      

    输出结果为:

  • 相关阅读:
    Blend3中创建的Silverlight程序在设计模式下无法显示图片的解决办法
    创建Silverlight Bussiness Application时报错的解决
    .NET 2.0 字符串比较
    ASP.NET 客户端缓存
    AjaxPro部署成功
    遭遇反序列化异常:"在分析完成之前就遇到流结尾"
    正则表达式
    哈哈,终于申请获得批准了!
    ClientScript.RegisterClientScriptInclude注册脚本
    今天经过一场深有体会的谈话终于决定了我2012的方向
  • 原文地址:https://www.cnblogs.com/pycrab/p/8933313.html
Copyright © 2011-2022 走看看