Java集合类-Set

概要图

集合Set

Java中使用Set接口描述一个集合(集合不允许有“重复值”,注意重复的概念),集合Set是Collection的子接口,Set不允许其数据元素重复出现,也就是说在Set中每一个数据元素都是唯一的。Set接口定义的常用方法如下:

序号 方法 描述
1 size() 获取Set尺寸(即Set包含数据元素的总数)
2 add(Object obj) 向Set中添加数据元素obj
3 remove(Object obj) 从Set中移除数据元素obj
4 contains(Object obj) 判断当前Set中是否包含数据元素obj,如果包含返回true,否则返回false
5 iterator() 将Set装入迭代器

Set接口的交集、并集、差集运算

序号 方法 描述
1 addAll(Collection c) 向Set中添加c包含的全部数据元素(并集)
2 removeAll(Collection c) 从Set中移除c包含的全部数据元素(差集)
3 retainAll(Collection c) 求Set和c的交集
4 containsAll(Collection c) 判断Set是否包含c中的全部数据元素,如果全部包含返回true,否则返回false

HashSet(散列集)

  • HashSet通过Hash算法排布集合内的元素,所谓的Hash算法就是把任意长度的输入(又叫做预映射),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射。对于不同类型的信息,其散列值公式亦不完全相同。

  • 当我们使用HashSet存储自定义类时,需要在自定义类中重写equals和hashCode方法,主要原因是集合内不允许有重复的数据元素,在集合校验元素的有效性时(数据元素不可重复),需要调用equals和hashCode验证。

  • HashSet在判断数据元素是否重复时,有两个步骤,注意先后顺序(此处可以看一看我的另一篇博客:浅析Java中的hashcode方法):

    1. 先检查hashCode值是否与集合中已有相同。
    2. 如果hashCode相同再调用equals方法进一步检查。(equals返回真表示重复)

TreeSet(树集)

  • TreeSet是一个有序集合,其元素按照升序排列,默认是按照自然顺序排列,也就是说TreeSet中的对象元素需要实现Comparable接口来实现自比较功能。TreeSet类中跟HashSet类一样也没有get()方法来获取指定位置的元素,所以也只能通过迭代器方法来获取。

  • TreeSet虽然是有序的,但是并没有具体的索引,当插入一个新的数据元素的时候,TreeSet中原有的数据元素可能需要重新排序,所以TreeSet插入和删除数据元素的效率较低。

  • 当我们使用TreeSet存储自定义类时,需要在自定义类实现Comparable接口并重写其compareTo方法,以提供比对形式,否在TreeSet不能对用户自定义的类型进行正确的树状排序。


Example

HashSet存储自定义类(这里假设为学生类)

  • 重写hashCode()方法:

    返回需要比较属性的hashCode()方法值,如果需要根据学生学号来区分对象,则

@Override
public int hashCode() {
return stuNo.hashCode();
}
  • 重写equals方法:去重条件为学号相同
public boolean equals(Object o){if(o == null){return false;}else{if(this == o){              //引用相同则必定相同return true;}else{//if(o instanceof Student){ //类型检测关键字Student stu = (Student) o;  //需要强制转换if(stu.getStuNo().equals(getStuNo())){return true;}}return false;}}}

TreeSet存储自定义类

需要提供比较器 Comparable or Comparator。

  • 在自定义类中重写compareTo()方法,以提供比对形式,否在TreeSet不能对用户自定义的类型进行正确的树状排序

  • 重写compareTo()方法以此实现Compareble接口,在下面的比较方法中,先比较学生的成绩,如果成绩相同,再比较学生学号

public class Student extends PStu implements Comparable<Student>{//采用泛型private String stuNo;private String stuName;private int score;@Overridepublic int compareTo(Student stu) {if(stu != null){if(score == stu.score){    //比较成绩return stuNo.compareTo(stu.getStuNo());  //比较学号,调用String类的CompareTo方法(String类也实现了Comparable接口)}return score - stu.score;}return 0;}}

上面使用的是内比较器,在往TreeSet集合中添加时将自比较进行排序,这种需要对我们使用的类做改变(实现Comparable接口重写compareTo方法),我们也可以使用外比较器来提供排序规则。例如:

这是我们的一个People类:

public class People{private String name;private int age;public People(String name,int age) {this.name = name;this.age = age;}  public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic int hashCode(){return this.name.hashCode();}@Overridepublic boolean equals(Object obj) {if(obj==null)return false;if(this==obj)return true;if(this.getClass()!=obj.getClass())  //检查类型是否一致,或使用instanceof关键字return false;return this.name.equals(((People)obj).name) && this.age== ((People)obj).age;}@Overridepublic String toString(){return "name:"+name+"  age:"+age;}
}

我们为People类写了一个外比较器:

package com.li.collection;import java.util.Comparator;/*一个用于People类的外比较器*/public class PeopleComparator implements Comparator<People> {@Overridepublic int compare(People o1, People o2) {//先按年龄比较,如果年龄相等,则按姓名if(o1.getAge()==o2.getAge())return o1.getName().compareTo(o2.getName());elsereturn o1.getAge()-o2.getAge();}}

测试:

package com.li.collection;import java.util.TreeSet;public class TreeSetLearning {public static void main(String[] args) {People p1 = new People("Jack", 18);People p2 = new People("Jack", 18);People p3 = new People("Rose", 18);People p4 = new People("Jack", 20);//指定TreeSet集合里边的对象按照这个外比较器的规则进行排序TreeSet<People> hashset = new TreeSet<People>(new PeopleComparator());hashset.add(p1);hashset.add(p2);hashset.add(p3);hashset.add(p4);System.out.println(hashset);System.out.println("capacity:"+hashset.size());}}

Java集合类-Set相关推荐

  1. Java 集合类详解

    0.参考文献 http://blog.csdn.net/liulin_good/article/details/6213815 1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比 ...

  2. java集合类深入分析之TreeMap/TreeSet篇

    2019独角兽企业重金招聘Python工程师标准>>> 简介 TreeMap和TreeSet算是java集合类里面比较有难度的数据结构.和普通的HashMap不一样,普通的HashM ...

  3. 【JAVA集合类(大公司面试喜欢问的) 】

    看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧. java.util包中包含了一系列重要的集合类,而对于集合类,主要 ...

  4. Java集合类: Set、List、Map、Queue区别及应用

    Java集合类基本概念 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的一个很好的选择,前提是我们事先已经明确知道我们将要保存的对象的数量.一旦在数组初始化时指定了这个数组长度,这个数 ...

  5. Java 集合类图(转)

    1.java集合类图 1.1 1.2 上述类图中,实线边框的是实现类,比如ArrayList,LinkedList,HashMap等,折线边框的是抽象类,比如AbstractCollection,Ab ...

  6. java 多线程集合操作_多线程中使用Java集合类

    Java集合类中,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection.通常在这些情况下,迭代的结果是不确定的.如果检测到这种行为,一些迭代器实现(包括 J ...

  7. java集合类详细概述

    2019独角兽企业重金招聘Python工程师标准>>> Java集合类   集合中存放的是对象的引用,而非对象本身 ,出于表达上的便利,简称为"集合中的对象". ...

  8. 多线程中使用Java集合类

    Java集合类中,某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection.通常在这些情况下,迭代的结果是不确定的.如果检测到这种行为,一些迭代器实现(包括 J ...

  9. java集合类(简介)

    JAVA集合类(介绍) 在使用Java的时候,我们都会遇到使用集合(Collection)的时候,但是Java API提供了多种集合的实现,我在使用和面试的时候频频遇到这样的"抉择" ...

  10. Java集合类学习总结

    Java集合类学习总结 这篇总结是基于之前博客内容的一个整理和回顾. 这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java核心技术 https://blog.csdn.net/colum ...

最新文章

  1. 2018年计算机应用基础作业,2018年计算机应用基础作业二答案.doc
  2. idea中Could not autowire. No beans of 'xxxxMapper' type found.问题解决
  3. 数据结构计算机复试题,计算机考研数据结构测试题(四)
  4. QT的QUrl类的使用
  5. 小米手机能用上鸿蒙吗,鸿蒙系统小米手机能用吗?鸿蒙系统支持第三方手机!
  6. 使用ML.NET预测纽约出租车费
  7. 【渝粤教育】国家开放大学2018年秋季 2322T物流信息技术 参考试题
  8. Andoird自定义ViewGroup实现竖向引导界面
  9. Java判断一个整数是否为水仙花数
  10. Docker(三) 使用容器数据卷实现数据持久化与容器数据共享
  11. 从项目的 GitHub 星星数看2018年 JavaScript 生态圈
  12. Maven里头的pom.xml配置详解
  13. JCTools简介-增强的并发工具
  14. 极客大学架构师训练营--食堂就餐系统架构设计⽂档 -- 第一次作业
  15. mysql与linux版本区别_MySQL各版本的区别
  16. Python 深入浅出 - HelloWorld
  17. O2O模式的赢利点有哪些?
  18. 一张图快速了解23种设计模式
  19. python主动推送链接至Bing站长平台分分钟让必应收录你的网页-必应SEO窍门
  20. java 枚举命名规则,枚举命名惯例 - 复数

热门文章

  1. 淘宝U站申请方法:个人如何申请淘宝U站?
  2. OLED电视之春:大势已成,就这样迎来好时光
  3. SRAtoolkit使用
  4. AutoCAD VBA简单文字操作
  5. QBXT 2018春季DP图论班 2018.4.29 --- 图论基础
  6. CentOS如何增加虚拟内存
  7. 【UV打印机】波形开发-开发流程(四)
  8. Show()跟ShowDialog()的区别
  9. 电脑PC微信客户端浏览器网页内容缓存在内存中,不在硬盘上,找不到的
  10. 【23届秋招】0828-文远知行C++测试开发工程师笔试