集合set

  • 对于集合set的定义
    • 一,set集合中的HashSet
    • 1.HashSet哈希表存储
    • 2.HashSet是如何保证元素唯一性的
    • 3.List与Set判断重复对象的区别
    • 二,集合框架TreeSet
    • 1.自然排序
    • 2.比较器排序
    • 三,Hashset 和 treeset 的区别

对于集合set的定义

不管你是老师教的还是百度上查资料的,他们都是说set的集合是无序,不可重复的。但是在jdk1.7以上版本中有做一些改变,如果是数字的话会按照从小到大排序;如果是字符串的话会按照首字母排序。

一,set集合中的HashSet

查看Api会发现,set集合的功能与Collection集合的功能是一致的(就方法调用而言);

1.HashSet哈希表存储

HashSet无序,不可重复,线程非同步。

哈希表底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,然后把这个对象存放在数组中。而这样的数组就称为哈希数组,即就是哈希表。

2.HashSet是如何保证元素唯一性的

HashSet是通过元素的两个方法:hashCode与equals方法来完成;

TreeSet可以对set集合中元素进行排序

String实现了Comparable接口,所以可以直接进行排序
引用数据类型想要排序,必须实现Comparable接口

import java.util.HashSet;
import java.util.Iterator;import sun.nio.cs.ext.TIS_620;/*** hashset本身具备去重复的功能?是滴* 那么需要探究hashset为什么能够去重,它依靠的是什么?* * @author Administrator**/
public class HashSetDemo {public static void main(String[] args) {//数据结构是哈希表,一个地址放两个东西HashSet hs = new HashSet();hs.add(new Person("liuting",18));hs.add(new Person("xuyang",22));hs.add(new Person("duanlian",32));hs.add(new Person("wangwang",12));hs.add(new Person("liuting",18));Iterator it = hs.iterator();while(it.hasNext()) {System.out.println(it.next());//打印}}
}class Person implements Comparable<Person> {private String name;private int sage;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getSage() {return sage;}public void setSage(int sage) {this.sage = sage;}public Person() {}public Person(String name, int sage) {super();this.name = name;this.sage = sage;}/*** 返回值代表着容器中的具体位置的坐标*/@Overridepublic int hashCode() {//重写hashCode()方法return this.getName().hashCode()+this.sage;}@Overridepublic boolean equals(Object obj) {if(obj instanceof Person) {Person p = (Person)obj;
//          this.name 还没有存放进新集合
//          p.getName()已经存放进去的System.out.println(this.getName()+"        "+p.getName());return this.getName().equals(p.getName())&&this.getSage()==p.getSage();}return false;}@Overridepublic String toString() {//重写toString 方法return "Person   [name="+this.name+"   ,age="+this.sage+"]";}/*** 正数:后面的o比当前(this)大*/@Overridepublic int compareTo(Person o) {int num = this.getSage() - o.getSage();if (num==0) {return this.getName().compareTo(o.getName());}return num ;}}

如果hashCode值相同,才会判断equals是否为true;

其他引用数据类型没有实现Comparable接口,那么会出现java.lang.ClassCastException: com.javaxl.Peroon cannot be cast to java.lang.Comparable,实现引用数据类型实现此接口就没问题了。

注意:对于判断元素是否存在,以及删除等操作,依赖的方法同样是hashCode、equals方法。

3.List与Set判断重复对象的区别

① List只依赖于equals方法
② Set依赖于hashCode、equals方法
③小李飞刀_集合框架

二,集合框架TreeSet

TreeSet是用来排序的,可以指定一个顺序,对象存入之后会按照指定的顺序排列

1.自然排序

public class TreeSetDemo {public static void main(String[] args) {//数据结构是哈希表,一个地址放两个东西TreeSet hs = new TreeSet();hs.add(2);hs.add(4);hs.add(3);hs.add(1);hs.add(5);Iterator it = hs.iterator();while(it.hasNext()) {System.out.println(it.next());}}}

实体类需要实现 compareTo方法

@Overridepublic int compareTo(Person o) {int num = this.getSage() - o.getSage();if (num==0) {return this.getName().compareTo(o.getName());}return num ;}

运行结果:12345

2.比较器排序

当元素自身不具备比较性时,或者具备的比较性不是所需要的;注意:这时需要让集合自身具备比较性

定义一个类,实现comparator接口,实现compare方法

package dome.zking.collection.set;import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.TreeSet;/*** Comparable接口的用途?*  使添加的元素自身具备排序规则,这种排序规则又被称为自然排序*  *  案例:*    给已知的集合进行排序*    *    当给对象赋予自然排序规则的时候必须按照以下规则来*       先判断主要条件,再判断次要条件*       *  需求变了*    前面的排序规则只适用于近一周的福利模块(先按年龄,再按姓氏)*    系统中有另一个模块,需要对于用户中排序规则进行更改(先按姓氏,再按年龄)*    *比较器comparator接口*  作用:使得容器具有比较性*  * @author Administrator**/
public class TreeSetDemo {public static void main(String[] args) {//数据结构是哈希表,一个地址放两个东西TreeSet hs = new TreeSet(new PersomCop());hs.add(new Person("liuting",18));hs.add(new Person("xuyang",22));hs.add(new Person("duanlian",32));hs.add(new Person("wangwang",12));hs.add(new Person("duanfei",32));Iterator it = hs.iterator();while(it.hasNext()) {System.out.println(it.next());}       }
}/*** 定义一个比较person的比较器*   规则:先按姓氏,再按年龄*   *   先主要条件再次要条件:如果不按照这个规则来,那么会发生数据丢失* @author Administrator**/
class PersomCop implements Comparator<Person>{@Overridepublic int compare(Person o1, Person o2) {int num = o1.getName().compareTo(o2.getName());if (num == 0) {return o1.getSage() - o2.getSage();}return num ;}}

注意:先主要条件再次要条件:如果不按照这个规则来,那么会发生数据丢失

当两种排序都存在时,比较器排序优先级更高
因此比较器用的多一些,在实际开发中,很多时候,引用数据类型是否具有比较性,或者比较规则,可能不由开发人员自己决定,
那么开发人员想要对应的引用数据类型按照自己的排序方式进行排列,那么就需要实现comparator接口,实现compare方法

三,Hashset 和 treeset 的区别

1、TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值。 2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。 3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的 String对象,hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。

对于集合set的定义相关推荐

  1. 从集合大小的定义到数学结构-解决了多年的疑惑

    从集合大小的定义到数学结构 [ 作者:佚名 | 转贴自:网络 | 点击数:1476 | 更新时间:2006-5-5 | 文章录入:ltq ] 一.古怪的定义 "自然数和正偶数,哪一种数更多? ...

  2. 求差集(C语言)两个集合的差集定义如下:集合A、B的差集,由所有属于A但不属于B的元素构成。输入两个集合A、B,每个集合中元素都是自然数。求集合A、B的差集。

    [问题描述] 两个集合的差集定义如下: 集合A.B的差集,由所有属于A但不属于B的元素构成. 输入两个集合A.B,每个集合中元素都是自然数.求集合A.B的差集. [输入形式] 从标准输入先输入集合元素 ...

  3. hashset java 键值对_Java集合 - HashSet的定义以及用法

    HashSet的定义 HashSet类实现了Set接口,由一个实际上是HashMap实例的散列表​支持.不能保证该集合的迭代次序,这意味着该类不能保证元素随时间的不变顺序.这个类允许null元素.该类 ...

  4. c语言证明加法交换律,与环定义相关的问题证明交换环定义为:集合R上定义加法和乘法,使得R中任何元素满足:(1)加法交换律 (2)加法结合律(3...

    共回答了22个问题采纳率:95.5% 命题1:对任意R中元素c都有 c*0=0.--定义为性质(9) 证明: 对任意R中元素c都有 c*(0+0)=c*0+c*0,--性质(8) 但是0+0=0,-- ...

  5. python 定义空集合 和定义空字典的

    python 中定义空集合 使用set 方法 list_a = set() # 定义一个空的集合 python中定义空字典使用 {} 或则使用dict() list_b = {} # 定义一个空的字典 ...

  6. python集合的元素可以是_Python - 集合与元素之集合定义和基本操作方法

    原博文 2019-10-05 14:58 − 集合(set) 定义:由不同元素组成的集合,集合中是一组无序排列可hash的值(不可变的值)例如数字.字符串.元组,可以作为字典的key 定义集合: # ...

  7. 【Flutter】Dart 数据类型 List 集合类型 ( 定义集合 | 初始化 | 泛型用法 | 初始化后添加元素 | 集合生成函数 | 集合遍历 )

    文章目录 I . 定义集合并初始化 II . 集合泛型用法 III . 集合添加元素 IV . 集合生成函数 V . 集合遍历 VI . 集合示例代码 I . 定义集合并初始化 定义并初始化 List ...

  8. Python集合类型详解(一)——集合定义与集合操作符

    今天继续给大家介绍Python相关知识,本文主要内容是Python集合类型定义与集合操作符. 一.集合类型定义 在Python中,集合是一种非常重要的组合数据类型.Python中的集合与数学中的集合非 ...

  9. java 定义map集合_Java中的Map集合

    Map集合: 个人感觉Map接口以后会经常用到,可以很清晰地查找某个对象,要熟悉其四种遍历方法.特别注意其键值对的键不能是重复的,有想定义有序存取的话,可以使用LinkedHashMap集合.不过定义 ...

最新文章

  1. c ef框架-mysql_.net EF框架 MySql實現實例
  2. SQLServer下 存储过程内 包含事务 及 返回处理是否成功
  3. Spring 注解 @Resource和@Autowired
  4. java读写html文件时出现中文乱码问题的解决方法
  5. Atitit r2017 r2 doc list on home ntpc.docx
  6. 树莓派64位系统_玩转树莓派之安装系统
  7. [篇五章二]_使用 USB 系统安装盘在真机上安装激活 Windows 10 LTSC 2021 中文企业版系统
  8. win10怎么用计算机二进制,教你如何使用Win10计算器进行进制转换?
  9. android英雄无敌 中文版下载地址,英雄无敌3手机版
  10. 转未来10年35项最值得你期待的技术
  11. CSS入门二、美化页面元素
  12. 前端初学,记下标签以后参考
  13. Android Tapjacking
  14. ubuntu远程访问win7登录后语言为繁体字的解决办法
  15. 数据结构之——关键路径
  16. python 分行读取txt文件
  17. 联想仅仅依靠不断的重组是不够的
  18. gitlab:修改project下载地址的默认域名和端口
  19. 用友U8二次开发调用API通用解决方案
  20. 2022年第四季度DAMA-CDGA/CDGP数据治理认证报名开启啦!

热门文章

  1. data:text/html html contenteditable,contentEditable
  2. 基于C-V2X智能网联搭建快速公交智慧交通
  3. Win7系统开机屏幕出现无信号输入 电脑开机屏幕显示没有信号
  4. springboot整合mybatis-plus完整案例
  5. puzzle(0916)智行营救、勇往直前
  6. C语言每日一练——第8天:冒泡排序
  7. 如何设置圆角的EditText——Android移动开发
  8. html表的标签奇数,将备用背景样式添加到HTML表的奇数行
  9. java随机数带字母_随机生成一组随机数(带字母和数字)
  10. 京东放弃快递员最佳雇主,人工智能如何变革13万亿物流产业?