一、Set集合

1.Set集合特点

可以去除重复
存取顺序不一致
没有带索引的方法,所以不能使用普通的for循环遍历,也不能通过索引来获取、删除Set集合里面的元素。

2.Set集合中元素的遍历

二、TreeSet集合(底层是红黑树)

1.TreeSet集合概述和特点

不可以存储重复元素
没有索引以及带索引的方法
可以将元素按照规则进行排序(如果需要对其他Student类型进行排序,必须指定排序规则 )

TreeSet():根据元素的自然顺序进行排序
TreeSet(Comparator comparator):根据指定的比较容器进行排序

2.自然排序Comparable的使用

使用空参构造创建TreeSet集合
自定义的Student类实现Comparable接口
重写里面的comparaTo方法

3.自然排序简单原理图

如果返回值为负数,表示当前存入的元素是较小值,存左边。
如果返回值为0,表示当前存入的元素在集合元素中重复了,不存。
如果返回值为正数,表示当前存入的元素为较大值,存右边。

4.比较器排序Comparator的使用

TreeSet的带参构造方法使用的是比较器排序对元素进行排序的。
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compara(T o1,T o2)方法。
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写。

5.TreeSet两种比较方式的对比

**自然排序:**自定义类实现Comparable接口,重写comparaTo方法,根据返回值进行排序。

**比较器排序:**创建TreeSet对象的时候传递Comparator的实现类对象,重写compara方法,根据返回值进行排序。

在使用的时候,默认是使用自然排序,当自然排序不满足现在的需求时,使用比较器排序。

两种方式中,关于返回值的规则:
如果返回值为负数,表示当前存入的元素是较小值,存左边。
如果返回值为0,表示当前存入的元素在集合元素中重复了,不存。
如果返回值为正数,表示当前存入的元素为较大值,存右边。

三、HashSet集合

1.HashSet集合特点

(1) 底层数据结构是哈希表
(2) 不能保证存储和取出顺序完全一致

2.哈希值

(1) 哈希值(哈希码值):是JDK根据对象的地址或者属性值,算出来的int类型的整数
(2) Object 类中有一个方法可以获取对象的哈希值
public int hashCode(): 根据对象的地址值计算出来的哈希值

注:同一个对象调用hashCode方法所计算出来的哈希值是一样的,因为在Object类中,是根据对象的地址值计算出来的哈希值。

(3) 我们可以对Object类中的hashCode方法进行重写,在重写之后,就一般是根据对象的属性值来计算哈希值的,此时跟对象的地址值就没有任何关系了。

3.对象的哈希值特点

如果没有重写hashCode方法,那么是根据对象的地址值计算出的哈希值。那么同一个对象多次调用hashCode()方法返回的哈希值是相同的,不同对象的哈希值是不一样的。

如果重写了hashCode方法,一般都是通过对象的属性值计算出哈希值,如果不同的对象属性值是一样的,那么计算出来的哈希值也是一样的。

四、常见数据结构之哈希表

1.哈希表

在JDK8之前,底层是采用数组+链表的形式实现。
在JDK8之后,底层进行了优化,采用的是数组+链表+红黑树实现。

2.HashSet1.7版本原理解析


(1) 创建一个默认长度为16,默认加载因子为0.75的数组,数组名为table
(2) 根据元素的哈希值与数组的长度计算出应该存入的位置
(3) 判断当前位置是否为null,如果是null直接存入
(4) 如果应存入的位置不为null,表示此位置有元素,则调用equals方法比较属性值。
(5) 如果一样,则不存;如果不一样,则存入数组,老元素在新元素下面。

加载因子是当数组里面存了16*0.75=12个元素的时候,数组就会扩容为原先的两倍。

3.HashSet1.8版本原理解析

底层结构:哈希表(数组、链表、红黑树的结合体)

这样优化的原因是:当挂在下面的元素过多,那么不利于添加,也不利于查询,所以在JDK8以后,当链表长度超过8的时候,自动转换为红黑树,但存储流程不变

五、Set集合小结

7.Set集合总结(TreeSet集合和HashSet集合)相关推荐

  1. 1-17 Set集合和Map集合

    Hash表 Hash,一般翻译做"散列",也有直接音译为"哈希"的,它是基于快速存取的角度设计的,也是一种典型的**"空间换时间"**的做法 ...

  2. android list 替换元素_Java 集合(二)——Set 集合、List 集合和 Collections 工具类...

    一.前言 在 Java 集合(一)中我们已经讲了 Collection 集合接口.Iterator 迭代器和泛型,今天我们来讲 Set 集合.List 集合 和 Collections 工具类. 二. ...

  3. Day_8/08(List集合和Set集合)

    目录 一.List集合 1.ArrayList集合 2.LinkedList集合 1.增加元素 2.查询元素 3.修改元素 4.删除元素 二.Set集合 1.HashSet集合 2.LinkedHas ...

  4. scala集合和java集合的转换-List

    scala集合和java集合的转换-List scala的List要想转换成java的list 需要导入对应的类scala.collection.JavaConverters._ import jav ...

  5. Map集合和List集合总结

    Map集合和List集合哪个效率更高 List接口 List集合是一个元素有序(存储有序).可重复的集合,集合中的每个元素都有对应的索引,以便于查询和修改,List集合是允许存储null值的. Lis ...

  6. Java-Collection集合和Map集合总结

    本文欢迎转载,转载前请联系作者,经允许后方可转载.转载后请注明出处,谢谢! http://blog.csdn.net/colton_null 作者:喝酒不骑马 Colton_Null from CSD ...

  7. Set集合和Collection集合

    1:Set集合(理解) (1)Set集合的特点无序,唯一 (2)HashSet集合(掌握)A:底层数据结构是哈希表(是一个元素为链表的数组)B:哈希表底层依赖两个方法:hashCode()和equal ...

  8. Set集合和Map集合

    Set接口和Map接口 回顾 1 集合概念,用来存储一组数据的容器.和数组类似,数组是长度固定的,集合长度可以变化.数组能存储基本类型和引用类型,集合只能存储引用类型. 2 Collection接口, ...

  9. Collection集合和Map集合循环遍历三种方法

    Collection集合的四种遍历方式: 1.迭代器 public static void main(String[] args) {List<String> list = new Arr ...

最新文章

  1. 如何右对齐弹性项目?
  2. mysql五大引擎之间的区别和优劣之分
  3. 2BizBox-ERP那点事儿系列之4
  4. 你完全没了解过的日志异步落库
  5. android 立体 流量球,Android自定义View——实现水波纹效果类似剩余流量球
  6. ajax获取对象获取不了属性,Ajaxing JavaScript变量到Django视图获取:AttributeError:“WSGIRequest”对象没有属性“data”...
  7. Android中的AutoCompleteTextView组件
  8. Apache中限制和允许特定IP访问
  9. AndroidStudio使用技巧-debug篇
  10. Java多线程:线程同步与关键字synchronized
  11. Postgresql临时表
  12. PHP语言之表单基础——educoder答案
  13. 图片相似度判断-差异值哈希算法JAVA版
  14. 网吧部分机器耳麦line in线要重插一下才能说话的设置
  15. 微信昵称乱码 mysql_微信昵称乱码及mysql编码格式设立(utf8mb4)_mysql
  16. c语言解除宏定义_C语言宏定义 define,及一些陷阱!
  17. 【Unity小游戏】打字消除字母
  18. CS1061号错误是什么
  19. 恶意代码分析实战 11 恶意代码的网络特征
  20. Python packing tools not found.

热门文章

  1. cocos 发布android 返回值2,cocos android编译出错
  2. LeetCode 52. N皇后 II
  3. mysql 清空表怎么恢复_mysql怎么恢复删除的表?mysql找回误删表的数据方法
  4. 微生物学综合性英文期刊mLife入选高起点新刊
  5. “完美论文”过于真实,道出了科研狗的痛
  6. 东北大米为何如此好吃丨混乱博物馆
  7. python使用matplotlib可视化、自定义设置Y轴刻度标签字体的大小( setting axis ticks size in matplotlib y axis)
  8. R语言ggplot2可视化:ggplot2可视化两个水平条形图(horizontal)、并设置两个条形图使用共享的X轴、使用类似population pyramid可视化的方式绘制共享X轴的水平条形图
  9. R语言dataframe计算满足筛选条件的行的个数(筛选满足条件的数据行并计数):类似于excel的countif函数
  10. R语言dplyr包的mutate函数将列添加到dataframe中或者修改现有的数据列:使用na_if()函数将0值替换为NA值、负收入替换为NA值