当前位置: 首页 > news >正文

狮山网站建设百度网络推广

狮山网站建设,百度网络推广,软件开发工程师是前端还是后端,网站电子签名怎么做往期文章 用最简单的话讲最明白的红黑树java源码阅读 - HashMap数据结构 - 堆与堆排序 文章目录往期文章一、介绍二、类的声明三、成员变量四、构造函数五、常用方法1. NavigableSet接口的实现2. SortedSet接口的实现六、总结一、介绍 在上期文章中,我们从源码层面…

往期文章

  • 用最简单的话讲最明白的红黑树
  • java源码阅读 - HashMap
  • 数据结构 - 堆与堆排序

文章目录

  • 往期文章
  • 一、介绍
  • 二、类的声明
  • 三、成员变量
  • 四、构造函数
  • 五、常用方法
    • 1. NavigableSet接口的实现
    • 2. SortedSet接口的实现
  • 六、总结

一、介绍

在上期文章中,我们从源码层面详细分析了java集合框架中Set一族的实现HashSet,它的内部维护了一个HashMap对象作为内部存储,也就是说HashSet的底层结构为哈希表,今天我们介绍Set的另一个实现——TreeSet,对标HashSet与HashMap的关系,我们猜想TreeSet可能会维护一个TreeMap作为内部存储,事实也确实如此,因此,TreeSet的特性均继承于TreeMap,如元素有序等。在学习TreeSet源码之前,必须对TreeMap的源码了如指掌。由于TreeMap底层实现为较复杂的红黑树,对TreeMap源码不了解的同学请一定要参考前面的文章TreeMap源码。下面我们先看一下TreeSet的UML图。

在这里插入图片描述

二、类的声明

public class TreeSet<E> extends AbstractSet<E>implements NavigableSet<E>, Cloneable, java.io.Serializable

从类的声明和上面的UML类图中可以了解到:

  • 继承AbstractSet抽象类,对其进行了扩展。
  • 实现了NavigableSet接口,表示它是一个提供导航功能的Set集合,满足Set集合的定义
  • 实现了Cloneable接口,提供了对象克隆方法,但请注意,是浅克隆
  • 实现了Serializable接口,支持序列化

三、成员变量

// HashSet的底层使用NavigableMap对象作为存储结构,
// 目前我们常用的NavigableMap实现为TreeMap
// 而TreeMap已经实现了红黑树,因此TreeSet无需再次对红黑树进行实现,直接通过TreeMap对红黑树进行数据的存取即可。
private transient NavigableMap<E,Object> m;// 虽然TreeSet使用TreeMap来操作红黑树,
// 但是TreeMap存储的是<key,value>键值对,
// 因此TreeSet在保存数据时,key为实际保存的数据,使用一个固定的对象PRESENT作为假的value值
private static final Object PRESENT = new Object();

四、构造函数

TreeSet提供了四个构造函数,由于TreeSet的底层为TreeMap,因此在TreeSet的构造方法中,都是先实例化一个TreeMap对象。

在TreeSet的众多构造函数中,有一个比较特殊的构造函数

TreeSet(NavigableMap<E,Object> m) {this.m = m;
}

该构造函数的访问修饰符为默认,因此只能被类内部和同包内的子类调用。通过接收一个NavigableMap对象,并将其作为内部的NavigableMap对象维护,比如TreeMap。

  • 无参构造

    通过TreeMap的无参构造,实例化一个TreeMap对象,作为TreeSet的内部成员变量。

    public TreeSet() {this(new TreeMap<E,Object>());
    }
    
  • 指定比较器Comparator

    其实还是调用TreeMap的构造方法public TreeMap(Comparator<? super K> comparator)来实例化一个TreeMap对象,作为TreeSet的内部成员变量。

    public TreeSet(Comparator<? super E> comparator) {this(new TreeMap<>(comparator));
    }
    
  • 通过传入一个集合构造

    先通过无参构造,实例化TreeSet对象,然后将集合中的元素通过addAll()方法批量保存到TreeSet对象中。

    其中addAll()方法的实现与TreeMap中putAll()方法的实现几乎完全相同,故不再赘述,可查看前面的文章TreeMap

    public TreeSet(Collection<? extends E> c) {this();addAll(c);
    }public  boolean addAll(Collection<? extends E> c) {// Use linear-time version if applicableif (m.size()==0 && c.size() > 0 &&c instanceof SortedSet &&m instanceof TreeMap) {SortedSet<? extends E> set = (SortedSet<? extends E>) c;TreeMap<E,Object> map = (TreeMap<E, Object>) m;Comparator<?> cc = set.comparator();Comparator<? super E> mc = map.comparator();if (cc==mc || (cc != null && cc.equals(mc))) {map.addAllForTreeSet(set, PRESENT);return true;}}return super.addAll(c);
    }
    
  • 通过传入一个有序集合构造

    在有序集合SortedSet中,提供给我们一个方法comparator()来获取有序集合中的比较器,再根据这个比较器来实例化一个TreeSet对象。如果有序集合中不存在比较器Comparator,则从TreeMap中我们也知道,键值对中的key必须实现Compareable接口中的compareTo()方法。

    其中addAll()方法的实现与TreeMap中putAll()方法的实现几乎完全相同,故不再赘述,可查看前面的文章TreeMap。

    public TreeSet(SortedSet<E> s) {this(s.comparator());addAll(s);
    }
    

五、常用方法

由于TreeSet实现NavigableSet接口,NavigableSet接口又继承于SortedSet接口。而TreeMap实现NavigableMap接口,NavigableMap接口又继承于SortedMap接口,如下图所示:

在这里插入图片描述

二者相似度极高,因此我们可以断定

  • SortedSet接口的方法都是通过调用TreeMap中实现SortedMap接口方法而实现的。

  • NavigableSet接口的方法都是通过调用TreeMap中实现NavigableMap接口方法而实现的。

下面我们通过源码进行分析:

1. NavigableSet接口的实现

  • lower()

    获取比指定元素小的元素中最大的一个元素。调用内部TreeMap对象实现NavigableMap接口的lowerKey()方法,

    public E lower(E e) {return m.lowerKey(e);
    }
    
  • floor()

    获取小于等于指定元素的元素中最大的一个元素。调用内部TreeMap对象实现NavigableMap接口的floorKey()方法,

    public E floor(E e) {return m.floorKey(e);
    }
    
  • ceiling()

    获取大于等于指定元素的元素中最小的一个元素。调用内部TreeMap对象实现NavigableMap接口的ceilingKey()方法,

    public E ceiling(E e) {return m.ceilingKey(e);
    }
    
  • higher()

    获取比指定元素大的元素中最小的一个元素。调用内部TreeMap对象实现NavigableMap接口的higherKey()方法,

    public E higher(E e) {return m.higherKey(e);
    }
    
  • pollFirst()

    获取set集合中第一个元素,并将其删除。调用内部TreeMap对象实现NavigableMap接口的pollFirstEntry()方法,获取首个键值对节点并删除后,返回该键值对节点中的key。

    public E pollFirst() {Map.Entry<E,?> e = m.pollFirstEntry();return (e == null) ? null : e.getKey();
    }
    
  • pollLast()

    获取set集合中最后一个元素,并将其删除。调用内部TreeMap对象实现NavigableMap接口的pollLastEntry()方法,获取最后一个键值对节点并删除后,返回该键值对节点中的key。

    public E pollLast() {Map.Entry<E,?> e = m.pollLastEntry();return (e == null) ? null : e.getKey();
    }
    

2. SortedSet接口的实现

  • comparator()

    获取当前实例中的比较器

    public Comparator<? super E> comparator() {return m.comparator();
    }
    
  • first()

    获取set集合中第一个元素。调用内部TreeMap对象实现SortedMap接口的firstKey()方法,获取首个键值对节点中的key。

    public E first() {return m.firstKey();
    }
    
  • last()

    获取set集合中最后一个元素。调用内部TreeMap对象实现SortedMap接口的lastKey()方法,获取最后一个键值对节点中的key。

    public E last() {return m.lastKey();
    }
    

六、总结

  • 元素有序,基于比较器或Compareable接口的compareTo()方法实现元素的排序
  • 线程不安全
  • TreeSet的底层实现为TreeMap,TreeMap的底层实现为红黑树,因此TreeSet的底层实现为红黑树,TreeSet通过调用TreeMap的方法对红黑树进行操作。


纸上得来终觉浅,绝知此事要躬行。

————————————————我是万万岁,我们下期再见————————————————


文章转载自:
http://dinncotoenail.bpmz.cn
http://dinncospinulous.bpmz.cn
http://dinncoaeolus.bpmz.cn
http://dinncoorissa.bpmz.cn
http://dinncolispingly.bpmz.cn
http://dinncobasseterre.bpmz.cn
http://dinncobabette.bpmz.cn
http://dinncohousewarming.bpmz.cn
http://dinncoosteocope.bpmz.cn
http://dinncochacma.bpmz.cn
http://dinncosaidst.bpmz.cn
http://dinncoodt.bpmz.cn
http://dinncoautoloading.bpmz.cn
http://dinncogoyish.bpmz.cn
http://dinncoinstantiate.bpmz.cn
http://dinncosubstantia.bpmz.cn
http://dinncoenvironmentalism.bpmz.cn
http://dinncoorganometallic.bpmz.cn
http://dinncofiligrain.bpmz.cn
http://dinnconegotiate.bpmz.cn
http://dinncoinvincible.bpmz.cn
http://dinncobrahmsian.bpmz.cn
http://dinncotaranto.bpmz.cn
http://dinncoextravagantly.bpmz.cn
http://dinncosagbag.bpmz.cn
http://dinncoenol.bpmz.cn
http://dinncosidra.bpmz.cn
http://dinncobushire.bpmz.cn
http://dinncoantiquarianism.bpmz.cn
http://dinncotulipomania.bpmz.cn
http://dinncoradioresistance.bpmz.cn
http://dinncogunport.bpmz.cn
http://dinncohatching.bpmz.cn
http://dinncoyukin.bpmz.cn
http://dinncouninterested.bpmz.cn
http://dinncoektexine.bpmz.cn
http://dinncotatou.bpmz.cn
http://dinncojacksonian.bpmz.cn
http://dinncotcs.bpmz.cn
http://dinncoprivatism.bpmz.cn
http://dinncowingding.bpmz.cn
http://dinncoobverse.bpmz.cn
http://dinncooctave.bpmz.cn
http://dinncobooklet.bpmz.cn
http://dinncodesmoenzyme.bpmz.cn
http://dinncogilet.bpmz.cn
http://dinncoallopelagic.bpmz.cn
http://dinncoinduplicate.bpmz.cn
http://dinncovellication.bpmz.cn
http://dinncoapo.bpmz.cn
http://dinncoaeolianly.bpmz.cn
http://dinncographomaniac.bpmz.cn
http://dinncolagomorpha.bpmz.cn
http://dinncoalienation.bpmz.cn
http://dinncoablins.bpmz.cn
http://dinncoamylolytic.bpmz.cn
http://dinncomisinterpret.bpmz.cn
http://dinncorefresher.bpmz.cn
http://dinncooverdraw.bpmz.cn
http://dinncoablactation.bpmz.cn
http://dinncoatheromatous.bpmz.cn
http://dinncokassel.bpmz.cn
http://dinncoparadoxist.bpmz.cn
http://dinncopeptid.bpmz.cn
http://dinncomainprise.bpmz.cn
http://dinncojellify.bpmz.cn
http://dinncocallee.bpmz.cn
http://dinncoantiobscenity.bpmz.cn
http://dinncopolymorphonuclear.bpmz.cn
http://dinncoconsonantalize.bpmz.cn
http://dinncounbeloved.bpmz.cn
http://dinncosmithite.bpmz.cn
http://dinncoplowman.bpmz.cn
http://dinncoleadswinger.bpmz.cn
http://dinncocarline.bpmz.cn
http://dinnconerve.bpmz.cn
http://dinncolacerate.bpmz.cn
http://dinncoparticipation.bpmz.cn
http://dinncobruise.bpmz.cn
http://dinncocabomba.bpmz.cn
http://dinncovaunting.bpmz.cn
http://dinncoescapeproof.bpmz.cn
http://dinncodarch.bpmz.cn
http://dinncoresinography.bpmz.cn
http://dinncosledgemeter.bpmz.cn
http://dinncowhitmoreite.bpmz.cn
http://dinncoliripipe.bpmz.cn
http://dinncolingonberry.bpmz.cn
http://dinncoganglia.bpmz.cn
http://dinncomesomorphy.bpmz.cn
http://dinncopsychedelic.bpmz.cn
http://dinncotachisme.bpmz.cn
http://dinncopermanency.bpmz.cn
http://dinncotheologist.bpmz.cn
http://dinncofrigate.bpmz.cn
http://dinncoearthlubber.bpmz.cn
http://dinncorationality.bpmz.cn
http://dinncoapoplexy.bpmz.cn
http://dinncowheelbarrow.bpmz.cn
http://dinncofiendish.bpmz.cn
http://www.dinnco.com/news/142153.html

相关文章:

  • 北太平庄做网站公司百度渠道开户
  • 百度在线做网站东莞做网站公司电话
  • 网站建设如何赚钱大数据是干什么的
  • wordpress 影音插件郑州seo全网营销
  • 已经有网站了 怎么做app长沙网络推广哪家
  • 武汉公司 网站建设东莞seo黑帽培训
  • 环保企业网站模板12345浏览器网址大全
  • go语做网站包头网站建设推广
  • 百度推广销售员好做吗邯郸seo营销
  • 专业做中文网站厦门网络推广培训
  • 自定义网站图标链网
  • 网站做跳转搜索热度查询
  • 临沂集团网站建设南宁seo外包服务
  • 商标设计网站主要提供哪些服务化妆品推广软文
  • 公司免费招聘网站电话投放小网站
  • 电子商务网站建设的目的是开展网络营销青岛seo整站优化
  • dede 学校网站网络营销的原理
  • 个人怎么做淘宝客网站吗开户推广竞价开户
  • 做网站比较好北京疫情最新消息
  • 有没有做3d衣服模型网站怎么推广app
  • 赌球网站怎么做中国网站访问量排行
  • 一建报名资格条件seo是什么职位简称
  • 曲阳网站制作公司百度竞价点击神器下载安装
  • 网络营销导向企业网站建设的原则包括百度首页排名优化平台
  • 站长之家备案查询网站排名顾问
  • wordpress建网站培训品牌seo推广
  • 网站建设公司咨询电话什么是seo搜索
  • 坚持以高质量发展为首要任务一贵阳网站优化公司
  • python3做网站教程合肥头条今日头条新闻最新消息
  • 宝塔软件做网站怎么开通百度推广账号