首页 > 编程语言 >Java中的Iterator接口,以及HashSet和TreeSet

Java中的Iterator接口,以及HashSet和TreeSet

时间:2024-10-13 19:20:44浏览次数:7  
标签:Java Iterator iterator HashSet 元素 add 添加 TreeSet

在Java编程中,`Iterator`接口是一个非常重要的概念,它为我们提供了一种统一且方便的方式来遍历集合(如`List`、`Set`、`Map`等数据结构中的元素,不过遍历`Map`时稍显特殊,通常是遍历其键值对的集合视图)。

## 一、Iterator接口的定义与方法

`Iterator`接口位于`java.util`包中,它定义了以下三个主要方法:

1. **`hasNext()`**
   - 这个方法用于判断在当前位置之后是否还有元素可供遍历。如果有,则返回`true`;如果已经到达集合的末尾,则返回`false`。
2. **`next()`**
   - 用于返回迭代中的下一个元素。在调用这个方法之前,通常需要先调用`hasNext()`方法来确保还有下一个元素,否则可能会抛出`NoSuchElementException`异常。
3. **`remove()`**
   - 这个方法用于从底层集合中移除由`next()`方法返回的最后一个元素。需要注意的是,这个方法在调用之前必须先调用`next()`方法,并且在对同一个元素不能多次调用`remove()`方法,否则会抛出`IllegalStateException`异常。

## 二、使用示例

下面我们以`ArrayList`为例来展示`Iterator`接口的使用。

```java
import java.util.ArrayList;
import java.util.Iterator;

public class IteratorExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");

        // 获取迭代器
        Iterator<String> iterator = list.iterator();

        // 使用hasNext()和next()遍历集合
        while (iterator.hasNext()) {
            String element = iterator.next();
            System.out.println(element);
        }

        // 使用remove()方法移除元素
        iterator = list.iterator();
        while (iterator.hasNext()) {
            String element = iterator.next();
            if ("Banana".equals(element)) {
                iterator.remove();
            }
        }

        System.out.println("After removing Banana:");
        iterator = list.iterator();
        while (iterator.hasNext()) {
            String element = iterator.next();
            System.out.println(element);
        }
    }
}
```

在这个示例中:

1. 首先我们创建了一个`ArrayList`并添加了三个字符串元素。
2. 然后我们通过`list.iterator()`获取了这个`ArrayList`的迭代器。
3. 在第一个`while`循环中,我们使用`hasNext()`和`next()`方法来遍历并打印出集合中的每个元素。
4. 接着,我们重新获取迭代器,并在第二个`while`循环中,当遍历到元素为`Banana`时,使用`remove()`方法将其从集合中移除。
5. 最后,我们再次遍历集合,展示移除元素后的结果。

《Java中的HashSet与TreeSet》

在Java的集合框架中,`HashSet`和`TreeSet`都是用于存储元素的集合类,但它们具有不同的特性和用途。

## 一、HashSet
1. **特性**
   - **无序性**:`HashSet`中的元素是没有顺序的。当我们向`HashSet`中添加元素时,元素的存储位置是由其哈希值(通过`hashCode()`方法计算)决定的,这就导致元素的存储顺序看起来是随机的。
   - **唯一性**:`HashSet`不允许存储重复的元素。在添加元素时,它会先根据元素的哈希值判断是否已经存在相同的元素,如果存在,则不会再次添加。
   - **基于哈希表实现**:内部使用哈希表(实际上是一个`HashMap`实例,元素存储在`HashMap`的键位置,值为一个固定的`Object`)来存储元素,这使得查找、添加和删除操作的平均时间复杂度为 $O(1)$(在理想情况下,没有哈希冲突时)。
2. **示例**
```java
import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> hashSet = new HashSet<>();

        hashSet.add("Apple");
        hashSet.add("Banana");
        hashSet.add("Cherry");
        hashSet.add("Apple");// 由于是重复元素,不会被添加

        for (String fruit : hashSet) {
            System.out.println(fruit);
        }
    }
}
```
在这个示例中,我们创建了一个`HashSet`,并向其中添加了几个字符串元素。尽管我们添加了两次`"Apple"`,但由于`HashSet`的唯一性,它只会被存储一次。当我们使用增强的`for`循环遍历`HashSet`时,元素的输出顺序是不确定的,可能是`"Apple"`、`"Banana"`、`"Cherry"`,也可能是其他顺序。

## 二、TreeSet
1. **特性**
   - **有序性**:`TreeSet`中的元素是按照自然顺序(对于实现了`Comparable`接口的元素类型)或者根据提供的`Comparator`进行排序的。例如,对于数字类型,会按照从小到大的顺序排列;对于字符串类型,会按照字典序排列。
   - **唯一性**:和`HashSet`一样,`TreeSet`也不允许存储重复的元素。在添加元素时,它会根据排序规则判断是否已经存在相同的元素。
   - **基于红黑树实现**:内部使用红黑树数据结构来存储元素,这使得添加、删除和查找操作的时间复杂度为 $O(\log n)$,其中`n`是集合中元素的数量。
2. **示例**
```java
import java.util.TreeSet;

public class TreeSetExample {
    public static void main(String[] args) {
        TreeSet<Integer> treeSet = new TreeSet<>();

        treeSet.add(3);
        treeSet.add(1);
        treeSet.add(5);
        treeSet.add(3);// 由于是重复元素,不会被添加

        for (Integer num : treeSet) {
            System.out.println(num);
        }
    }
}
```
在这个示例中,我们创建了一个`TreeSet`并向其中添加了几个整数元素。由于`TreeSet`的有序性,元素会按照从小到大的顺序输出,即`1`、`3`、`5`。并且,重复的`3`不会被再次添加到集合中。

## 三、HashSet与TreeSet的选择
1. **如果不需要排序**
   - 当我们只关心元素的唯一性,而不需要元素按照特定顺序存储和访问时,`HashSet`是更好的选择。因为`HashSet`的哈希表实现通常在查找、添加和删除操作上具有更好的性能(平均时间复杂度为 $O(1)$)。
2. **如果需要排序**
   - 如果我们需要元素按照某种顺序存储和访问,例如按照数字大小或者字符串字典序,那么`TreeSet`是合适的选择。虽然它的操作时间复杂度为 $O(\log n)$,比`HashSet`在理想情况下稍慢,但它提供了有序性的优势。

标签:Java,Iterator,iterator,HashSet,元素,add,添加,TreeSet
From: https://blog.csdn.net/2301_77081232/article/details/142902630

相关文章

  • StringUtils Java字符串工具类
    在我们的代码中经常需要对字符串判空,截取字符串、转换大小写、分隔字符串、比较字符串、拼接字符串、使用正则表达式等等。如果只用String类提供的那些方法,我们需要手写大量的额外代码,不然容易出现各种异常。现在有个好消息是:org.apache.commons.lang3包下的StringUtils工......
  • [vue3 JavaScript CSS]实现电商网站商品预览,图片放大镜功能
    da效果预览:当鼠标浮在图片上时,灰色小框跟随鼠标运动。右侧大图显示。灰色框不会跑出图片,鼠标移动,右侧大图相应跟随移动。实现思路在实现前,我们想梳理一下我们要实现什么功能灰色框跟随鼠标移动,注意处理边界情况当鼠标进入时右侧大图出现,鼠标移出时右侧大图消失鼠标向左......
  • Java——数组的定义与使用
    各位看官:如果您觉得这篇文章对您有帮助的话欢迎您分享给更多人哦感谢大家的点赞收藏评论,感谢您的支持!!!一:数组的概念以及定义,初始化1.1:数组概念以及定义数组概念:可以看成是相同类型元素的一个集合。数组定义:三种方法T[]数组名=newT[N];例如:int[]a......
  • java计算机毕业设计基于springboot和vue的耐思招聘网站的设计与实现(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网的快速发展和信息技术的不断进步,招聘行业正经历着从传统模式向数字化、智能化转型的关键时期。传统的招聘方式存在信息不对称、效率低下等......
  • java+vue计算机毕设高信誉大学生就业网【源码+程序+论文+开题】
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今社会,随着高等教育的普及和就业市场的日益竞争激烈,大学生面临的就业压力愈发沉重。传统的就业渠道和方式已难以满足当前大学生的多样化需求,尤其......
  • Java【String类】
    字符串的本质是字符数组,是由字母、数字、汉字、下划线组成的一串字符。在Java中字符串属于对象。字符串是常量,内容用双引号括起来,在创建之后不能更改,但是可以使用其他变量重新赋值的方法进行更改。目录1.String类创建方式1.1直接创建1.2用new关键字创建2.String类的A......
  • 免费送源码:Java+ssm+MySQL 心理治愈平台 计算机毕业设计原创定制
    摘 要随着社会的飞速发展和信息时代的到来,我们所处的社会也在发生着前所未有的变化。这主要体现在人们的生活节奏不断加快,活动范围在不断拓展,人与人的交往越来越多,处理微妙复杂的人际关系为每个人所不可避免,各种各样的竞争强度也越来越巨大,人与人之间的收入、社会地位等......
  • JavaScript基础1
    实验介绍:JavaScript可以使网页进行交互。它和Java没有任何关系,但在它出现的时候Java很热门,为了引起人们对它的重视,它起名JavaScript。一:JavaScript里的新概念语法DOM对象是一种编程接口,允许我们从文档中增删改除元素。当浏览器加载一个网页时,它会将网页中的HTML内容解析成一......
  • Java 根据指定字段实现对对象进行去重
    文章目录引入问题方法一:使用HashSet数据结构方法二:使用Java8的StreamAPI的distinct()去重方法三:使用Map数据结构方法四:使用Collectors.toMap()方法方法五:使用Collectors.collectingAndThen()方法注:该文中的多种方法实现涉及Java8StreamAPI特性......
  • 深拷贝与浅拷贝:JavaScript 里的“复制粘贴”大作战
    在JavaScript的世界里,复制对象就像是在玩“传声筒”游戏,听着听着就乱了套。今天,我们要聊聊两个“复制”大法:深拷贝和浅拷贝。他们就像是“有深度的朋友”和“表面交情的朋友”,那么到底有什么区别呢?让我们一起看看!1.浅拷贝:表面交情浅拷贝就像你和朋友一起去吃火锅,你们的......