Set 接口及其常用方法

这篇具有很好参考价值的文章主要介绍了Set 接口及其常用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 循环来遍历元素,但不能通过索引的方式来遍历元素。文章来源地址https://www.toymoban.com/news/detail-482724.html

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 接口及其常用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第12章_集合框架(Collection接口,Iterator接口,List,Set,Map,Collections工具类)

    1.1 生活中的容器 1.2 数组的特点与弊端 一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。 另一方面,使用数组存储对象方面具有 一些弊端 ,而Java 集合就像一种容器,可以 动态地 把多个对象的引用放入容器中。 数

    2024年01月25日
    浏览(33)
  • 【Java 集合框架API接口】Collection,List,Set,Map,Queue,Deque

    博主: _LJaXi Or 東方幻想郷 专栏: Java | 从跨行业到跨平台 开发工具: IntelliJ IDEA 2021.1.3 Java集合API提供了一组功能强大的数据结构和算法, 具有以下作用( 简述 ) 存储和组织数据 提供高效的数据访问和操作 实现算法和数据处理 提供线程安全性 支持泛型编程 java.util.Collection

    2024年02月12日
    浏览(34)
  • List 接口及其常用方法

    List 接口是 Collection 接口的子接口,其主要特点如下: List 中元素有序,是按照元素的插入顺序进行排序的。每个元素都有一个与之关联的整数型索引(索引从 0 开始),可以根据索引来访问和操作元素,可以使用普通 for 循环遍历。 List 中可以包含重复的元素。 下面的代码

    2024年02月08日
    浏览(34)
  • Collection接口详细介绍(上)

    前言: 本篇文章主要讲解 Java中的Collection接口以及相关实现类 的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~ 小威在此先感谢各位小伙伴儿了😁 以下正文开始 Java中的集合

    2024年02月11日
    浏览(29)
  • String类的学习笔记(上):介绍String类及其常用方法的使用

    本文介绍了Java中用来描述操作字符串的String类,和其一些常用的基本操作方法,字符串的创建输出,字符串对象的比较,字符串查找,字符串的转化,字符串的替换,字符串拆分,字符串截取,和大小写转换,去除左右空格,子字符串包含,学会使用这些方法,能更方便的使用操作字符串~ 前言

    2023年04月23日
    浏览(43)
  • Java的Set接口及其实现类(面试题)

    Set接口中没有额外定义新的方法,使用的都是Collection接口中声明过的方法。 Set实现类之一: HashSet @HashSet是Set接口的典型实现,大多数时候使用Set集合时都使用这个实现类。 ●HashSet按Hash算法来存储集合中的元素,因此具有很好的存取、查找、删除性能。 ●HashSet具有以下特点

    2024年02月09日
    浏览(28)
  • 【Collection集合】概述、使用以及常用方法

    1.Collection集合的概述 它是单列集合的顶级接口,它表示一组对象,这些对象也称为Collection的元素 JDK不提供此接口的任何直接实现,它提供更具体地子接口(如set和list)实现 2.创建Collection集合的对象 多态的方式 具体的实现类ArrayList,在java.util包下需要导包 向集合里添加元

    2024年02月08日
    浏览(27)
  • Redis 数据类型及其常用命令一(string、list、set、zset、hash)

    1、简介         Redis 的常用数据类型有十种,分别为:string、list、set、zset、hash、geo、hyperloglog、bitmap、bitfield、stream。熟练使用各种数据类型,能够快速结合场景进行使用。 注:我们所说的数据类型是指 value 的数据类型,key 都是字符串。 所有类型的命令查看:help @数据类

    2024年03月13日
    浏览(47)
  • Java中TreeSet的基本介绍,细节讨论,使用注意事项,常用方法,底层源码分析

    TreeSet 是 Java 中的一个有序集合实现,它基于红黑树数据结构来存储元素, 可以保持元素的自然顺序(默认情况下升序)或者根据自定义比较器来进行排序 。下面是关于 TreeSet 的基本介绍、细节讨论、使用注意事项、常用方法以及一些底层实现细节。 基本介绍: TreeSet 是

    2024年02月11日
    浏览(29)
  • 【C++】详解map和set基本接口及使用

    关联式容器也是用来存储数据的,但与序列式容器不同的是,关联式容器里面存储的是 key, value 结构的键值对,因此**在数据检索时比序列式容器效率更高**。 键值对是用来表示 具有一一对应关系的一种结构 ,该结构中一般只包含两个成员变量 – key 和 value;其中 key 代表键

    2024年02月08日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包