Java集合类Treeset实现细节

一、TreeSet定义

TreeSet同样是基于TreeMap实现的,我们知道TreeMap是一个有序的二叉树,那么同理TreeSet同样也是一个有序的,它的作用是提供有序的Set集合。通过源码我们知道TreeSet基础AbstractSet,实现NavigableSet、Cloneable、Serializable接口。其中AbstractSet提供 Set 接口的骨干实现,从而最大限度地减少了实现此接口所需的工作。NavigableSet是扩展的 SortedSet,具有了为给定搜索目标报告最接近匹配项的导航方法,这就意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。Cloneable支持克隆,Serializable支持序列化。

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

同时在TreeSet中定义了如下几个变量。

private transient NavigableMap<E,Object> m;        //PRESENT会被当做Map的value与key构建成键值对 
private static final Object PRESENT = new Object();
 
  
  
构造方法摘要
TreeSet()           构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。
TreeSet(Collection<? extends E> c)           构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。
TreeSet(Comparator<? super E> comparator)           构造一个新的空 TreeSet,它根据指定比较器进行排序。
TreeSet(SortedSet<E> s)           构造一个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。
 
TreeSet使用细节      

1、TreeSet()是使用二叉树的原理对新add()的对象按照指定的顺序排序(升序、降序),每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。

2、Integer和String对象都可以进行默认的TreeSet排序,而自定义类的对象是不可以的,自己定义的类必须实现Comparable接口,并且覆写相应的compareTo()函数,才可以正常使用。

3、同时也可以创建comparator比较器,对其中的compare()函数进行覆写,使得TreeSet按照一定的规则来排序

 
实现comparable接口
  
  
  1. public class TreeSetTest {  
  2.     public static void main(String args[]){  
  3.         Persontest per1 = new Persontest("zhangsan"33);  
  4.         Persontest per2 = new Persontest("lisi"33);  
  5.         Persontest per3 = new Persontest("wangwu"22);  
  6.         Persontest per4 = new Persontest("zhaoliu"44);  
  7.           
  8.         TreeSet treeSet=new TreeSet();    
  9.           
  10.         treeSet.add(per1);  
  11.         treeSet.add(per2);  
  12.         treeSet.add(per3);  
  13.         treeSet.add(per4);  
  14.   
  15.         Iterator iterator=treeSet.iterator();    
  16.         while(iterator.hasNext()){    
  17.             Persontest t=(Persontest) iterator.next();    
  18.             System.out.println(t.getName()+"的年纪是"+t.getAge());    
  19.         }    
  20.     }  
  21. }  
  22.   
  23. class Persontest implements Comparable{  
  24.     private String name;  
  25.     private int age;  
  26.     public void setName(String name){  
  27.         this.name = name;  
  28.     }  
  29.       
  30.     public void setAge(int age){  
  31.         this.age = age;  
  32.     }  
  33.       
  34.     public String getName(){  
  35.         return this.name;  
  36.     }  
  37.       
  38.     public int getAge(){  
  39.         return this.age;  
  40.     }  
  41.       
  42.     public Persontest(String name, int age){  
  43.         this.name = name;  
  44.         this.age = age;  
  45.     }  
  46.       
  47.     public int compareTo(Object obj){  
  48.         Persontest per = (Persontest) obj;  
  49.         if(per.age < this.age){  
  50.             return -1;  
  51.         }  
  52.         if(per.age > this.age){  
  53.             return 1;  
  54.         }  
  55.         if(per.age == this.age){  
  56.             return this.name.compareTo(per.name);  
  57.         }  
  58.         return 0;  
  59.     }  
  60. }  
 
实现comparator接口    
  
  
  1. // 需要在类中新建一个自己的比较器  
  2. public class TreeSetTest2 {  
  3.     public static void main(String args[]){  
  4.           
  5.         TreeSet ts = new TreeSet(new Human.Comp());  
  6.         ts.add(new Human("zhangsan"33));  
  7.         ts.add(new Human("lii"44));  
  8.         ts.add(new Human("wangwu"33));  
  9.         ts.add(new Human("zhuliu"55));  
  10.           
  11.         Iterator it = ts.iterator();  
  12.         while(it.hasNext()){  
  13.             System.out.println(it.next());  
  14.         }  
  15.     }  
  16. }  
  17.   
  18. class Human{  
  19.     private String name;  
  20.     private int age;  
  21.     public Human(String name, int age){  
  22.         this.name = name;  
  23.         this.age = age;  
  24.     }  
  25.     public String toString(){  
  26.         return "姓名:"+name+" 年龄:"+age;  
  27.     }  
  28.       
  29.     static class Comp implements Comparator{  
  30.         public int compare(Object ob1, Object ob2){  
  31.             Human h1 = (Human)ob1;  
  32.             Human h2 = (Human)ob2;  
  33.             int result = h1.age > h2.age ? 1 :(h1.age == h2.age ? 0 : -1);  
  34.             if(result == 0){  
  35.                 result = h1.name.compareTo(h2.name);  
  36.             }  
  37.             return result;  
  38.         }  
  39.     }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值