Set接口简介

Set接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,它是比Collection接口更加严格了。与List接口不同的是,Set接口元素无序,并且都会以某种规则保证存入的元素不出现重复。

Set接口主要有两个实现类,分别是HashSet和TreeSet。其中,HashSet根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。TreeSet则是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序

HashSet集合

HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当向HashSet集合中添加一个对象时,首先会调用该对象的hashCode()方法来计算对象的哈希值,从而确定元素的存储位置。如果此哈希值相同,再调用对象的equals()方法来确保该位置没有重复元素。Set集合与List集合存取元素的方式都一样。

通过一个案例来演示HashSet集合的用法:

public class Example01 {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add("老大");
set.add("老二");
set.add("老三");
set.add("老二");
Iterator it = set.iterator();
while(it.hasNext()) {
Object obj = it.next();
System.out.println(obj);
}
}
}

结 论:

当向集合中存入元素时,为了保证HashSet正常工作,要求在存入对象时,重写Object类中的hashCode和equals()方法。

上述案例将字符串存入HashSet时,String类已经重写了hashCode()和equals()方法。但是如果将Student对象存入HashSet,结果又会怎样呢?

class Student{
String id;
String name;
public Student(String id, String name) {
super();
this.id = id;
this.name = name;
}
@Override
public String toString() {
return id+":"+name;
}
@Override
public int hashCode() {
return id.hashCode(); //返回id属性的哈希值
}
@Override
public boolean equals(Object obj) {
if(this == obj) { //判断是否是同一个对象
return true; //如果是,直接返回true
}
if(!(obj instanceof Student)) { //判断对象是为Student类型
return false; //如果对象不是Student类型返回false
}
Student stu = (Student) obj; //将对象强转为Student类型
boolean b = this.id.equals(stu.id); //判断id值是否相同
return b; //返回判断结果
}
}
public class Example02 {
public static void main(String[] args) {
HashSet set = new HashSet();
set.add(new Student("1", "老王"));
set.add(new Student("2", "老三"));
set.add(new Student("2", "老三"));
System.out.println(set);
}
}

Student类重写了Object类的hashCode()和equals()方法。在hashCoded()方法中返回id属性的哈希值,在equals()方法中比较对象的id属性是否相等,并返回结果。当调用HashSet集合的add()方法添加stu3对象时,发现它的哈希值与stu2对象相同,而且stu2.equals(stu3)返回true。HashSet集合认为两个对象相同,因此重复的Student对象对成功去除了。

Java中的Set集合的更多相关文章

  1. Java中如何克隆集合——ArrayList和HashSet深拷贝

    编程人员经常误用各个集合类提供的拷贝构造函数作为克隆List,Set,ArrayList,HashSet或者其他集合实现的方法.需要记住的是,Java集合的拷贝构造函数只提供浅拷贝而不是深拷贝,这意味 ...

  2. 【集合】Java中的具体集合(一)

    Java中不止提供了集合框架中的接口,还提供了许多具体的实现. Java中的具体集合 集合类型 描述 ArrayList 一种可以动态增长和缩减的索引序列 LinkedList 一种可以在任何位置进行 ...

  3. java中数组、集合、字符串之间的转换,以及用加强for循环遍历

    java中数组.集合.字符串之间的转换,以及用加强for循环遍历: @Test public void testDemo5() { ArrayList<String> list = new ...

  4. Java中的List集合和迭代器

    一.Java中的List集合. 终于有时间来好好整理一下Java中的集合. 首先要讲的就是List集合.Java中List集合主要将两个: 第一个是底层使用数组维护的ArrayList,第二个是底层是 ...

  5. java中 列表,集合,数组之间的转换

    java中 列表,集合,数组之间的转换 java中 列表,集合,数组之间的转换 java中 列表,集合,数组之间的转换 List和Set都是接口,它们继承Collection(集合),集合里面任何数据 ...

  6. JAVA中所有与集合有关的实现类都是这六个接口的实现类

    JAVA中所有与集合有关的实现类都是这六个接口的实现类. Collection接口:集合中每一个元素为一个对象,这个接口将这些对象组织在一起,形成一维结构. List接口代表按照元素一定的相关顺序来组 ...

  7. Java中泛型在集合框架中的应用

    泛型是Java中的一个重要概念,上一篇文章我们说过,当元素存入集合时,集合会将元素转换为Object类型存储,当取出时也是按照Object取出的,所以用get方法取出时,我们会进行强制类型转换,并且通 ...

  8. Java中list<Object>集合去重实例

    一:Java中list去重的方法很多,下面说一下其中一种方法:把list里的对象遍历一遍,用list.contain(),如果不存在就放入到另外一个list集合中: 二:实例 这里需要注意的是:使用c ...

  9. Java中多个集合的交集,并集和差集

    一.交集 java中交集使用 A.retainAll(B) ,交集的结果在集合A中. import org.junit.Test; import java.util.HashSet; import j ...

  10. java中数组以及集合

    java中数组: 数组在Java里是一种特殊类型,有别于普通的“类的实例”的对象.但实际数组也是一种对象类型,int[]a = new int[5]  a是在java栈中分配的引用变量,类型是int[ ...

随机推荐

  1. leetcode 36 有效的数独 哈希表 unordered_set unordersd_map 保存状态 leetcode 37 解数独

    leetcode 36 感觉就是遍历. 保存好状态,就是各行各列还有各分区divide的情况 用数组做. 空间小时间大 class Solution { public: bool isValidSud ...

  2. select(),fd_set(),fd_isset()

    1. select函数 1. 用途 在编程的过程中,经常会遇到许多阻塞的函数,好像read和网络编程时使用的recv, recvfrom函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在 ...

  3. 如何通过 terminal 查看一个文件的 meta信息

    如何通过 terminal 查看一个文件的 meta 信息 Linux shell stat 查看文件 meta 信息 stat stat指令:文件/文件系统的详细信息显示: 使用格式:stat 文件 ...

  4. web components & publish custom element & npm

    web components & publish custom element & npm https://www.webcomponents.org/publish Polymer ...

  5. js replace all

    js replace all https://stackoverflow.com/questions/1144783/how-can-i-replace-all-occurrences-of-a-st ...

  6. back to top & back to bottom

    back to top & back to bottom infinite auto load more & infinite scroll & load more https ...

  7. input number step

    input number step <!DOCTYPE html> <html> <body> <h1>The input step attribute ...

  8. html->pdf直接下载

    import html2Canvas from 'html2canvas' import JsPDF from 'jspdf' export default{ install (Vue, option ...

  9. Flutter WillPopScope 拦截路由返回

    WillPopScope addScopedWillPopCallback 启用此路由以使用户否决尝试以将其关闭. 典型应用是如果用户尝试退出表单,则警告用户有关未保存的表单数据.连按两次返回键退出A ...

  10. scrapy 运行逻辑

    爬虫的步骤:发送请求获得响应→解析并提取数据→保存数据 我们沿用这个朴素的逻辑去理解scrapy 一.发送请求获得响应 1.爬虫发送请求request到引擎 2.引擎将请求request传递给调度器s ...