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不一定相等;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TreesetHashset的区别主要有以下几点: 1. 实现方式不同:Treeset是通过实现Comparable接口的compareTo方法来保证元素的唯一性和排序的,而Hashset是通过复写hashCode()方法和equals()方法来保证元素的唯一性的。 2. 底层数据结构不同:Treeset的底层数据结构是二叉树,可以对集合中的元素进行排序,这种结构可以提高排序性能。而Hashset的底层数据结构是哈希表,通过哈希值来存储元素,可以快速定位元素。 3. 元素的顺序不同:Treeset中的元素是按照元素的自然顺序进行排序的,或者根据自定义的比较器进行排序。而Hashset中的元素是无序的。 4. 判断元素唯一性的方式不同:Treeset是通过比较方法的返回值来判断元素是否重复,如果返回值为0,则代表元素重复。而Hashset是先判断元素的hashCode值是否相同,如果不同,则直接存储元素;如果相同,则再判断equals方法的返回值是否为true,如果为true,则视为同一个元素,不再存储。 综上所述,TreesetHashset在实现方式、底层数据结构、元素顺序和判断元素唯一性的方式上存在差异。 #### 引用[.reference_title] - *1* *3* [HashSetTreeSet的区别](https://blog.csdn.net/qq_42216184/article/details/84026603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [HashsetTreeset的区别](https://blog.csdn.net/m0_37235955/article/details/105624398)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值