首页 > 其他分享 >Set 接口及其常用方法

Set 接口及其常用方法

时间:2023-06-14 22:57:28浏览次数:23  
标签:常用 Set name 接口 Person add set public

Set 接口基本介绍

Set接口是Collection接口的一个子接口,其主要特点如下:

  1. 不允许重复元素:Set接口的实现类不会包含重复的元素。更正式地说,不包含任何一对使得e1.equals(e2)成立的元素e1e2,并且最多只能有一个null元素。当尝试添加重复元素时,添加操作将被忽略。

  2. 无序性:Set接口取出元素的顺序和添加元素的顺序不一致(但是每次取出的顺序是固定的),即无法通过索引访问Set中的元素。

Set接口的常用实现类有HashSetTreeSetLinkedHashSet。可以使用迭代器和增强 for 循环遍历元素,但是不能使用普通 for 循环(不能使用索引)。下面的代码以其实现类HashSet演示Set接口的特点。

public class TestSet() {
  public static void main(String[] args) {
    Set set = new HashSet();
    set.add("Phoebe");
    set.add("Monica");
    set.add("Phoebe"); // 重复
    set.add("Ross");
    set.add("Chandler");
    set.add("Rachel");
    set.add(null);
    set.add(null); // 再次添加 null
    // 10 次输出结果均为:set=[Phoebe, null, Rachel, Ross, Chandler, Monica]
    // 重复的 Phoebe 和 null 都只输出了一个,
    // 取出顺序和添加顺序不一致但每次取出顺序都是相同的。
    for (int i = 0; i < 10; i++) {
      System.out.println("set=" + set);
    }
  }
}

注意:如果Set集合的元素是可变对象时,必须要小心。如果以影响equals()方法比较结果的方式修改Set中的元素的值,集合的行为是未指定的。这种情况的特例是Set不能将自身作为元素。以下以一个简单的 Person 类来测试修改HashSet中元素的值使得两个元素equals()方法比较结果相同时的情况。

public class Person {
  private String name;
  
  public Person() {
  }

  public Person(String name) {
    this.name = name;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person person = (Person) o;
    return name.equals(person.name);
  }

  @Override
  public int hashCode() {
    return Objects.hash(name);
  }

  @Override
  public String toString() {
    return "Person{" +
      "name='" + name + '\'' +
      '}';
  }
}
public class TestModifyValue() {
  public static void main(String[] args) {
    Set set = new HashSet();
    
    // 创建 3 个 Person 实例,其中 rose1.equals(rose2) 成立
    Person jack = new Person("Jack");
    Person rose1 = new Person("Rose");
    Person rose2 = new Person("Rose");
    // 将其添加到 set 中
    set.add(jack);
    set.add(rose1);
    set.add(rose2);
    
    // 可以看到只添加成功一个姓名为 Rose 的 Person 实例,其应为 rose1。
    System.out.println("set = " + set); // set = [Person{name='Rose'}, Person{name='Jack'}]

    // 将 set 添加到自身中,未添加成功
    set.addAll(set);
    System.out.println("set = " + set); // set = [Person{name='Rose'}, Person{name='Jack'}]

    // 将 rose1 的 name 属性修改为 Jack
    rose1.setName("Jack");
    System.out.println(rose1.equals(jack)); // true
    // 可以看到此时 set 集合中仍有两个对象,其 equals() 方法比较结果相同。
    System.out.println("set = " + set); // set = [Person{name='Jack'}, Person{name='Jack'}]
  }
}

Set 接口常用方法

Set接口和List接口一样,也是Collection接口的子接口,因此常用方法和Collection接口一样。但需要注意由于Set接口不包含重复元素,所以addAll()方法的参数也是Set时,addAll操作会有效地修改该集合,使其值为两个集合的并集

public class SetAddAll() {
  public static void main(String[] args) {
    Set set = new HashSet();
    set.add("Phoebe");
    set.add("Monica");
    set.add("Ross");
    System.out.println("set = " + set); // set = [Phoebe, Ross, Monica]

    Set set1 = new HashSet();
    set1.add("Phoebe");
    set.add("Chandler");

    set.addAll(set1);
    System.out.println("set = " + set); // set = [Phoebe, Ross, Chandler, Monica]
  }
}

Set 接口遍历元素方式

Set接口遍历元素的方式和Collection接口的一样,可以使用迭代器和增强 for 循环来遍历元素,但不能通过索引的方式来遍历元素。

public class SetThroughElements() {
  public static void main(String[] args) {
    Set set = new HashSet();
    set.add("Phoebe");
    set.add("Monica");
    set.add("John");

    System.out.println("---使用迭代器---");
    Iterator iterator = set.iterator();
    while (iterator.hasNext()) {
      Object obj =  iterator.next();
      System.out.println("obj = " + obj);
    }

    System.out.println("---使用增强 for---");
    for (Object o :set) {
      System.out.println("o = " + o);
    }

    // 不能使用普通 for 循环,因为 Set 不支持索引
  }
}

标签:常用,Set,name,接口,Person,add,set,public
From: https://www.cnblogs.com/echo97/p/17481557.html

相关文章

  • Docker CLI docker container export 常用命令
    Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。Docker是内核虚拟化,不使用Hypervisor是不完全虚拟化,依赖内核的特性实现资源隔离。本文主要介绍DockerCLI中d......
  • pytest接口自动化(一)
    这里说下pytest接口自动化的工程项目的基本结构(个人的工程结构),项目工程主要使用pytest、pymysql、requests、pyyaml、allure-pytest、pytest-rerunfailures、pytest-xdist、filelock等插件。首先工程结构api_test[工程名称]api 存放接口的封装方法,方法中一般存着......
  • SystemVerilog接口练习
           结合《SystemVerilog验证测试平台编写指南》和《FPGA应用开发和仿真》,在gVim里敲代码,学习一下接口的用法。1interfacemembus2#(3parameterLEN=256,DW=84)5(6inputwireclk,7inputwirerst8);9logic[$clog2(......
  • JDBC-API详解-ResultSet
       packageTest;importorg.junit.Test;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;publicclassJDBCdemo4_ResultSet{@TestpublicvoidtestResultSet()throwsException......
  • MONAI中,一定要学会的三种Dataset使用方法
    在正式学习MONAI功能函数前,以下的网址必须要收藏。1.MONAIAPI: https://docs.monai.io/en/latest/index.html作用:查询功能函数的用法,主要分为以下几类2.MONAIGitHub项目地址: https://github.com/Project-MONAI   作用:如果上述API介绍的不够完整,可以去项目里面找一些例子......
  • springboot-feign接口压缩异常
    WARNorg.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver-Resolved[org.springframework.http.converter.HttpMessageNotReadableException:JSONparseerror:Illegalcharacter((CTRL-CHAR,code31)):onlyregularwhitespace(\r,\......
  • 「Solution Set」06/14
    P9329[JOISC2023Day1]TwoCurrencies简单题。因为每次尽量花银币,而且尽可能在银币花销比较小的花银币,所以整一棵主席树,二分。P7984[USACO21DEC]TicketsP原来这道题当时只有我没写啊/hsh假如我们只从一个点进入,我们可以直接线段树优化建图。然后我们发现一个性质:只要......
  • 基于XC7Z100+OV5640(DSP接口)YOLO人脸识别模块编写思路(部分1)
    填充模块设计及代码编写填充模块的功能对卷积层的输入数据进行填充操作,即在数据的四周加上一圈0,以保持特征图的尺寸不变或增大例如,将\(416*416\)的数据填充为\(418*418\)的数据填充模块的设计思路以第一层卷积层(layer0)的输入数据为例,图像尺寸为\(416*416\),通道数......
  • 推荐系统中的常用算法——Wide & Deep
    1.概述在前DeepLearning时代,以LogisticRegression(LR)为代表的广义线性模型在CTR,CVR中得到了广泛的应用,主要原因包括:模型足够简单,相当于不包括隐含层的神经网络;可扩展性强;可解释性强,因为是线性的模型,可以很方便的显现出特征对最终结果的强弱。虽然线性模型有如上的优点,但同时也存在......
  • Hadoop学习笔记——Hadoop常用命令
    Hadoop下有一些常用的命令,通过这些命令可以很方便操作Hadoop上的文件。1、查看指定目录下的内容语法:hadoopfs-ls文件目录2、打开某个已存在的文件语法:hadoopfs-cat文件地址[|more][]表示的是可选命令3、将本地文件存到Hadoop语法:hadoopfs-put本地文件地址Hadoop目录4......