Set接口

    特点:

      【1】Set接口表示一个唯一、无序的容器(和添加顺序无关)  

   Set接口常用实现类有

  HashSet

        【1】HashSet是Set接口的实现类,底层数据结构是哈希表。

        【2】HashSet是线程不安全的(不保证同步)

        

        【3】根据哈希表的工作原理,请存储一个自定义对象到HashSet中。一定要实现hashCode方法和equals方法

       【4】优点:添加、删除、查询效率高;缺点:无序

LinkedHashSet

        【1】LinkedHashSet是Set接口的实现类,底层数据结构哈希表+链表哈。希表用于散列元素;链表用于维持添加顺序

        【2】如果要添加自定义对象元素,也需要重写hashCode和equals方法。 

    TreeSet

        【1】TreeSet 是Set接口的实现类,底层数据结构是二叉树

        【2】TreeSet 存储的数据按照一定的规则存储。存储规则让数据表现出自然顺序。

        【3】输出时按照一定的规则:左子树->根节点->右子树

          特殊:【4】比较策略分两种:内部比较器和外部比较器 

          内部比较器  

          (1)当一个自定义对象实现Comparable并实现compareTo方法时,通过指定具体的比较策略,此时称为内部比较器。

          (2)比较策略一般当前对象写在前面,待比较对象也在后面,比较结果默认升序

                  return  this.getAge() - o.getAge() ;  如果想要降序,改变两个比较对象的位置即可

            (3)也可以多种比较因素

          @Override
     public int compareTo(Student o) {
    /*if(this.getAge()<o.getAge()) {
   return -1;
  }else if(this.getAge() == o.getAge()) {
   return 0;
  }else {
   return 1;
   }*/    // return this.getAge() - o.getAge() ;    if(this.getAge()<o.getAge()) {
   return -1;
   }else if(this.getAge() == o.getAge()) {
   return this.getName().compareTo(o.getName());
  }else {
   return 1;
   }
   }

      外部比较器

          (1)当实际开发过程中不知道添加元素的源代码、无权修改别人的代码,此时可以使用外部比较器。

          (2)Comparator 位于java.util包中,定义了compare(o1,o2) 用于提供外部比较策略。TreeSet接受一个指定比较策略的构造方法,这些比较策略的实现类必须实现Comparator

          (3)使用匿名内部类优化

    public class Test02 {
     public static void main(String[] args) {      TreeSet<String> set2 = new TreeSet<String>(new Comparator<String>() {    @Override
   public int compare(String o1, String o2) {
   return o1.length() - o2.length();
   }
  
   });    set2.add("banana");
   set2.add("coco");
   set2.add("apple");    set2.add("apple");
   System.out.println(set2);   }
  }

    

最新文章

  1. ABP理论学习之领域服务
  2. hdu 4717(三分求极值)
  3. Web UI - Javascript之DOM Ready
  4. 轻量型ORM框架Dapper的使用
  5. 模拟 2013年山东省赛 J Contest Print Server
  6. js查找出现次数最多的字母
  7. 阿里云ECS每天一件事D1:配置SSH
  8. No http handler was found for request type &#39;GET&#39;
  9. 使用WiX Toolset创建.NET程序发布Bootstrapper(安装策略管理)(一)——初识WiX
  10. 播放视频的框架Vitamio的使用问题
  11. file 上传文件后缀名 限制
  12. C#中MessageBox.Show()方法详解
  13. JS区分中英文字符的两种方法: 正则和charCodeAt()方法
  14. Delegate、Thread、Task、ThreadPool几种方式创建异步任务性能对比
  15. 12C -- ORA-12850: 无法在所有指定实例上分配从属进程: 需要 2, 已分配 1
  16. Java版本知识
  17. mobile开发备忘
  18. django 自动化测试的故障排查
  19. spring boot 配置全局日期类型转换器
  20. (转)C#与Outlook交互收发邮件

热门文章

  1. Swoole 协程与 Go 协程的区别
  2. Invalidate()这个函数有什么用?
  3. NOIP2015提高组 跳石头 ACM-ICPC2017香港 E(选择/移除+二分答案)
  4. Json文件转Excel
  5. C++的dllexport和dllimport
  6. Silhouette-Outlined Diffuse
  7. 学习SpringMVC时遇到的一些问题
  8. 大整数因子(高精mod)
  9. uoj#280. 【UTR #2】题目难度提升(构造)
  10. Python面向对象之鸭子类型