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

Java_TreeSet与TreeMap源码解读

TreeSet底层是TreeMap,二者区别在于:

    public boolean add(E e) {return m.put(e, PRESENT)==null;}

TreeSet在使用方法时,e作为元素添加,而PRESENT作为一个用于占位的空对象,表示没有意义

TreeMap使用方法时,由于是作为键值对添加进去的,此时e 就等于key,而PRESENT 就等于value

TreeSet演示:

package com.CollectionStu_.Set_;import java.util.Comparator;
import java.util.TreeSet;
@SuppressWarnings({"all"})
public class TreeSet_ {public static void main(String[] args) {
//        TreeSet treeSet = new TreeSet();//1.当我们使用无参构造器创建TreeSet时,仍然是无序的//2.可以使用TreeSet提供的一个构造器,可以传入一个比较器(匿名内部类)//  并指定排序规则//例:希望添加的元素能够按照字符串大小进行排序(这里是从小到大)TreeSet treeSet = new TreeSet(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {//下面调用String的 compareTo方法进行字符串大小比较return ((String)o2).compareTo((String) o1);//从大到小把o2 和o1 对调即可}});//添加数据treeSet.add("jack");treeSet.add("tom");treeSet.add("nihao");treeSet.add("mary");System.out.println(treeSet);//排序前(直接输出):[jack, mary, nihao, tom]//排序后(从小到大):[tom, nihao, mary, jack]//源码分析:/*构造器:public TreeSet(Comparator<? super E> comparator) {this(new TreeMap<>(comparator));}构造器会把传入的匿名对象new Comparator() 赋给TreeSet底层的TreeMap的属性this.comparator在调用add("tom") 时,在底层会执行到Comparator<? super K> cpr = comparator; //cpr就是匿名内部类(对象)if (cpr != null) {do {parent = t;cmp = cpr.compare(key, t.key);  //动态绑定到匿名内部类的compare()if (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;else                            //如果相等,即返回0,这个数据(Key)就没有加入return t.setValue(value);} while (t != null);}*/}
}

TreeMap演示:

package com.MapStu_.Map_;import java.util.Comparator;
import java.util.TreeMap;
@SuppressWarnings({"all"})
public class TreeMap_ {public static void main(String[] args) {TreeMap treeMap = new TreeMap();treeMap.put("jack","杰克");treeMap.put("tom","汤姆");treeMap.put("nihao","泥嚎");treeMap.put("smith","史密斯");//使用默认构造器创建TreeMap(无序的,也没有排序)System.out.println(treeMap);//{jack=杰克, nihao=泥嚎, smith=史密斯, tom=汤姆}//使用带comparator的构造器控制排序//    public TreeMap(Comparator<? super K> comparator) {//        this.comparator = comparator;//    }//例:要求按照传入的key(String) 大小进行排序TreeMap treeMap1 = new TreeMap(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {return ((String)o1).compareTo((String)o2);}});treeMap1.put("jack","杰克");treeMap1.put("tom","汤姆");treeMap1.put("nihao","泥嚎");treeMap1.put("smith","史密斯");System.out.println(treeMap1);//要求按照字符串长度大小排序TreeMap treeMap2 = new TreeMap(new Comparator() {@Overridepublic int compare(Object o1, Object o2) {return ((String)o1).length() - ((String)o2).length();}});/*源码解读:1. 构造器. 把传入的实现了 Comparator接口的匿名内部类(对象),传给给TreeMap的comparatorpublic TreeMap(Comparator<? super K> comparator) {this.comparator = comparator;}2. 调用put方法2.1 第一次添加, 把k-v 封装到 Entry对象,放入rootEntry<K,V> t = root;if (t == null) {compare(key, key); // type (and possibly null) checkroot = new Entry<>(key, value, null);size = 1;modCount++;return null;}2.2 以后添加Comparator<? super K> cpr = comparator;if (cpr != null) {do { //遍历所有的key , 给当前key找到适当位置parent = t;cmp = cpr.compare(key, t.key);//动态绑定到我们的匿名内部类的compareif (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;else  //如果遍历过程中,发现准备添加Key 和当前已有的Key 相等,就不添加return t.setValue(value);} while (t != null);}*/}
}
http://www.dtcms.com/a/587249.html

相关文章:

  • 做网站济南毕业设计做系统网站好
  • 数据资产化与数字化转型:通过SQL2API加速企业业务决策
  • 简单按键模拟
  • 营销型网站易网拓类似淘宝的购物网站 建设
  • 芜湖网站建设推广asp网站建设课程设计
  • 温州网站建设最新报价互联网金融营销案例
  • 网站建设和网站运营包括什么手机软件设计用什么软件
  • 教育网站建设改版网站制作网站建
  • DNS高速缓存分离解析
  • 中国建设门户网站旅游网站建设步骤
  • 想学做网站 应该学宁波人才网
  • 达梦新云文档数据库分享
  • 徐州网站客户上海网络推广营销
  • 海南网站优化公司网络公司优化关键词
  • 淘宝放单网站怎么做北京网站怎么建设
  • 南宁做网站 的游戏网络公司名字
  • 硬核对决:小鹏 IRON 与特斯拉 Optimus,人形机器人赛道的技术路线博弈
  • 做网站用虚拟主机怎么样自己做网站导航页
  • 德阳网站优化wordpress一行太宽了
  • 湘潭网站建设开发wordpress对接小程序
  • 北京模板网站开发公司营销型网站建设设计6
  • 免疫算法学习
  • 定制程序网站厦门建设局局长李德才
  • 中关村在线官方网站一 建设网站前的市场分析
  • 网站建设需要哪些证书做个外贸网站设计
  • 饰品设计网站推荐网站设置黑白色
  • 推广网站的网址和网鱼相匹配wordpress不用服务器
  • 个人做网站要买什么域名医疗公司logo设计图片
  • 网站快速排名是怎么做的wordpress保存图片不显示
  • 可信网站 收费做那个男女的视频网站