java笔记之Set集合、Collection接口

简介: java笔记之Set集合、Collection接口

Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合中,但Set集合中不能包含重复对象。Set集合由Set接口和Set接口的实现类组成。Set接口继承了Collection接口,因此包含Collection接口的所有方法。

Set的构造有一个约束条件,传入的Collection对象不能有重复值,必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true,则会出现一些问题。

Set接口常用的实现类有HashSet类与TreeSet类。 HashSet类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证Set的迭代顺序,特别是它不保证该顺序恒久不变。此类允许使用null元素。

TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,因此,TreeSet类实现的Set集合在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序,即可以通过比较器对用TreeSet类实现的Set集合中的对象进行排序。

遍历该集合中的全部元素,以及通过headSet()、subSet()方法获得的部分集合。栗子:

import java.util.*;
public class UpdateStu implements Comparable<Object> {
  String name;
  long id;
  public UpdateStu(String name, long id) {
    this.id = id;
    this.name = name;
  }
  public int compareTo(Object o) {
    UpdateStu upstu = (UpdateStu) o;
    int result = id > upstu.id ? 1 : (id == upstu.id ? 0 : -1);
    return result;
  }
  public long getId() {
    return id;
  }
  public void setId(long id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public static void main(String[] args) {
    UpdateStu stu1 = new UpdateStu("李同学", 01011);
    UpdateStu stu2 = new UpdateStu("陈同学", 01021);
    UpdateStu stu3 = new UpdateStu("王同学", 01051);
    UpdateStu stu4 = new UpdateStu("马同学", 01012);
    TreeSet<UpdateStu> tree = new TreeSet<>();
    tree.add(stu1);
    tree.add(stu2);
    tree.add(stu3);
    tree.add(stu4);
    Iterator<UpdateStu> it = tree.iterator();
    System.out.println("Set集合中的所有元素:");
    while (it.hasNext()) {
      UpdateStu stu = (UpdateStu) it.next();
      System.out.println(stu.getId() + " " + stu.getName());
    }
    it = tree.headSet(stu2).iterator();
    System.out.println("截取前面部分的集合:");
    while (it.hasNext()) {
      UpdateStu stu = (UpdateStu) it.next();
      System.out.println(stu.getId() + " " + stu.getName());
    }
    it = tree.subSet(stu2, stu3).iterator();
    System.out.println("截取中间部分的集合");
    while (it.hasNext()) {
      UpdateStu stu = (UpdateStu) it.next();
      System.out.println(stu.getId() + " " + stu.getName());
    }
  }
}

存入TreeSet类实现的Set集合必须实现Comparable接口,该接口中的compareTo(Object o)方法比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、0或正整数。

headSet()、subSet()、tailSet()方法截取对象生成新集合时是否包含指定的参数,可通过如下方法来判别:如果指定参数位于新集合的起始位置,则包含该对象,如subSet()方法的第一个参数和tailSet()方法的参数;如果指定参数是新集合的终止位置,则不包含该参数,如headSet()方法的入口参数和subSet()方法的第二个入口参数。

Collection接口是层次结构中的根接口。构成Collection的单位称为元素。Collection接口通常不能直接使用,但该接口提供了添加元素、删除元素、管理数据的方法。由于List接口与Set接口都继承了Collection接口,因此这些方法对List集合与Set集合是通用的。

常遍历集合,都是通过迭代器(Iterator)来实现。Collection接口中的iterator()方法可返回在此Collection进行迭代的迭代器。下面的实例就是典型的遍历集合的方法。

package com.lzw;
import java.util.*;
public class Muster { // 创建类Muster
  public static void main(String args[]) {
    Collection<String> list = new ArrayList<>(); // 实例化集合类对象
    list.add("a"); // 向集合添加数据
    list.add("b");
    list.add("c");
    Iterator<String> it = list.iterator(); // 创建迭代器
    while (it.hasNext()) { // 判断是否有下一个元素
      String str = (String) it.next(); // 获取集合中元素
      System.out.println(str);
    }
  }
}


相关文章
|
9月前
|
Java 大数据 API
Java Stream API:现代集合处理与函数式编程
Java Stream API:现代集合处理与函数式编程
401 100
|
9月前
|
Java API 数据处理
Java Stream API:现代集合处理新方式
Java Stream API:现代集合处理新方式
385 101
|
8月前
|
存储 算法 安全
Java集合框架:理解类型多样性与限制
总之,在 Java 题材中正确地应对多样化与约束条件要求开发人员深入理解面向对象原则、范式编程思想以及JVM工作机理等核心知识点。通过精心设计与周密规划能够有效地利用 Java 高级特征打造出既健壮又灵活易维护系统软件产品。
221 7
|
9月前
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
263 11
|
8月前
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
335 1
|
8月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
474 2
|
11月前
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
704 1
|
存储 JavaScript 前端开发
for...of循环在遍历Set和Map时的注意事项有哪些?
for...of循环在遍历Set和Map时的注意事项有哪些?
754 156
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
388 2
|
8月前
|
存储 算法 容器
set_map的实现+set/map加持秒杀高频算法题锻炼算法思维
`set`基于红黑树实现,支持有序存储、自动去重,增删查效率为O(logN)。通过仿函数可自定义排序规则,配合空间配置器灵活管理内存。不支持修改元素值,迭代器失效需注意。`multiset`允许重复元素。常用于去重、排序及查找场景。