TreeSet和HashSet

TreeSet

TreeSet基本知识

TreeSet :

是由TreeMap维护的

无序的,去重的

底层结构 : 红黑树(平衡二叉树)

特点 :查询效率高,去重,默认升序排序

应用场景 : 适合应用在存储多个单个值的数据的集合,去重的,自动升序排序的场景

新增功能 : 新增了一些与比较大小相关的方法:floor、ceiling、higher、lower、first、last

遍历方式 : foreach iterator

去重 : java提供的类型都能实现自动去重,实现升序排序

去重和排序

注意:

		在排序之前必须涉及到数据的大小比较,如果存在比较规则,可以比较大小,就可以正常实现排序,但是如果不存在比较规则,无法比较大小,无法排序
		TreeSet的去重与排序 : 只根据比较规则实现去重与排序,与equals方法无关

**1.**测试TreeSet是否能够同时存储不同类型的数据 : java.lang.ClassCastException 不能存储多个不同类型数据,因为不是同种类型数据无法比较大小,无法升序排序

**2.**定义TreeSet存储自定义User类型的数据 : java.lang.ClassCastException

查到TreeSet集合中存储的类型数据的比较规则

1)定义TreeSet时候,构造器中通过参数传递比较规则-->外部比较规则

2)检查存储的数据类型是否存在默认的比较规则,如果存在使用,如果还不存在,就抛出异常 -->内部比较规则

比较规则|比较器

比较器|比较规则 :
        内部比较器|内部比较规则|自然排序 : 实体类实现java.lang.Comparable接口,重写int compareTo(T o) 方法,方法的内部定义比较规则
            int compareTo(T o) :   x.compareTo(y)
                返回值 : 比较的结果
                    0  --> x==y
                    <0 --> x<y
                    >0 --> x>y


        外部比较器|外部比较规则|定值排序 : 实现类实现Comparator接口重写compare方法,方法内部定义比较规则

内部比较器

			|自然排序规则|默认比较规则 : 要比较的数据类型内部定义的比较规则
			要比较的数据类型(Student)实现Comparable 接口,重写compareTo()方法,方法内部指定比较规则

外部比较器

			|定值排序规则|自定义比较规则 : 要比较的数据类型外部定义比较规则
			实现Comparator<T>接口,重写compare方法,方法内部定义外部比较规则
			可以匿名内部类实现
		优缺点分析
			内部比较器: 使用简单,但是不便于后期维护
			外部比较器: 使用繁琐,但是便于后期维护
注意 : TreeSet集合存储自定义的引用数据类型数据,去重与升序排序都是根据比较规则(比较器)    需要自己实现内部或外部比较器,根据实际情况选择

HashSet

HashSet基础

底层是由HashMap维护的

无序的,去重的

底层结构 : 哈希表(jdk1.8之前:数组+链表 jdk1.8及之后:数组+链表+红黑树)

特点 : 查询增删效率高

应用场景 : 存储数据要求唯一,能自动去重的情况下,查询增删效率都较高可以选择使用HashSet

新增方法 : 没有新增方法

遍历方式 : foreach iterator

去重 : 要求重写哈希表存储的数据类型的hashCode与equals方法,实现根据所有属性值重写,而非根据地址比较计算;

重写hashCode与equals方法的前提下 : 根据所有属性值重写;

equals返回值相等两个对象,调用hashCode肯定相等(相等才能在同一个桶中,才有机会调用equals比较去重); hashCode返回值相等,equals不一定相等;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值