当前位置: 首页 > news >正文

Java数据结构之Set学习总结

前言:

   前面介绍了Java的数据结构List、Map,今天抽空学习总结一下另一种数据结构Set。

Set介绍

   Set相对于List、Map是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。

特点:

  •  它不允许出现重复元素;
  • 不保证和政集合中元素的顺序
  • 允许包含值为null的元素,但最多只能有一个null元素

Set是一个接口,实例化Set可以采用下面的方式:

  • HashSet: HashSet类按照哈希算法来存取集合中的对象,存取速度比较快 
  • TreeSet :TreeSet类实现了SortedSet接口,能够对集合中的对象进行排序 

Set的基本操作:

  •  boolean add(Object o)   :向集合中加入一个对象的引用
  • void clear()                        :删除集合中所有的对象,即不再持有这些对象的引用
  • boolean isEmpty()           :判断集合是否为空
  • boolean contains(Object o): 判断集合中是否持有特定对象的引用
  • Iterartor iterator()              : 返回一个Iterator对象,可以用来遍历集合中的元素
  • boolean remove(Object o):从集合中删除一个对象的引用
  • int size()                               :返回集合中元素的数目
  • Object[] toArray()                 :返回一个数组,该数组中包括集合中的所有元素

Set的使用

添加数据

Set<Integer> hashSet = new HashSet<Integer>();
 hashSet.add(3);
 hashSet.add(2);
 hashSet.add(5);
 hashSet.add(1);
 //模拟添加一个重复数据
 hashSet.add(2);
 Log.e(TAG,"set hashSet :"+hashSet+" size : "+hashSet.size());

 Set<Integer> treeSet = new TreeSet<>();
 treeSet.add(3);
 treeSet.add(2);
 treeSet.add(5);
 treeSet.add(1);
 Log.e(TAG,"set treeSet :"+treeSet +" size : "+treeSet.size());

运行结果:

 通过运行结果可以看出,Set是不可重复的,TreeSet是有序的,HashSet是无序的。

TreeSet实现排序默认是升序,想要实现自定义排序可以通过传进去一个Comparator或者TreeSet的添加对象实现Comparator接口。

Set遍历

for循环方式

  for (Integer integer :hashSet){
            Log.e(TAG,"set integer :"+integer);
   }

迭代器方式

Iterator<Integer> iterator =hashSet.iterator();
while (iterator.hasNext()){
     Integer integer=iterator.next();
     Log.e(TAG,"set integer :"+integer);
   }

知识扩展:

 最近在阿里java开发手册上看到了这句话:Map/Set 的 key 为自定义对象时,必须重写 hashCode 和 equals。这里Set集合中放入的是String类型,假如我们放入一个自己定义的类实例的时候,比如Person类实例,这时候我们要自己重新hashcode和equal方法,用自己的关键字段来重写,因为当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code值是否与增加的对象的hash code值一致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去

总结:

 主要重新熟悉一下Map这种数据结构,更好的在项目中使用不可重复的数据结构。

 

相关文章:

  • 调用PostgreSQL存储过程,找不到函数名的问题
  • CAP理论
  • HDU 2501 Tiling_easy version
  • 透明代理Transparent Proxy
  • linux 配置软连接的需要注意的一个问题
  • zookeepr集群环境搭建
  • 排球比赛积分规则---三层架构
  • [译] 看动画,学 RxJS
  • (zhuan) 一些RL的文献(及笔记)
  • java 的底层通信--Socket
  • java.util.concurrent.CountDownLatch用方法
  • PSI分析
  • Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释...
  • maven的基本原理和使用
  • cocos2d-x -Lua 字符串
  • #Java异常处理
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • java8-模拟hadoop
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • nodejs:开发并发布一个nodejs包
  • php的插入排序,通过双层for循环
  • Redis中的lru算法实现
  • scala基础语法(二)
  • v-if和v-for连用出现的问题
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 回流、重绘及其优化
  • 前言-如何学习区块链
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 微信小程序填坑清单
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • ​决定德拉瓦州地区版图的关键历史事件
  • #pragma multi_compile #pragma shader_feature
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • ( 10 )MySQL中的外键
  • (3)(3.5) 遥测无线电区域条例
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (二)hibernate配置管理
  • (九十四)函数和二维数组
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十)c52学习之旅-定时器实验
  • (十六)Flask之蓝图
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (学习日记)2024.02.29:UCOSIII第二节
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)Oracle存储过程编写经验和优化措施
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • .htaccess配置常用技巧
  • .Net - 类的介绍