Java中Collections.list方法将Enumeration转List

Collections.list() 将 Enumeration 转为 ArrayList,实现新旧 API 平滑过渡,简化代码并支持现代集合操作。

java中collections.list方法将enumeration转list

Collections.list()

是 Java 提供的一个便捷方法,它能将一个旧式的

Enumeration

接口包装成一个现代的

ArrayList

,从而方便我们使用

Collection

框架的丰富功能,实现新旧 API 之间的平滑过渡。

解决方案

在 Java 的早期版本中,

Enumeration

接口是遍历集合元素的主要方式。你可能会在一些遗留的 API 中遇到它,比如

Hashtable

elements()

keys()

方法,或者

Vector

elements()

方法。然而,随着 Java 5 引入了泛型和

Iterable

接口,以及后来 Java 8 引入的 Stream API,

List

接口以及整个

Collection

框架提供了更强大、更灵活、更现代的编程范式。

Collections.list()

方法的出现,正是为了解决这种新旧 API 之间的“代沟”。它的作用非常直接:接收一个

Enumeration

类型的参数,然后遍历这个

Enumeration

中的所有元素,并将它们添加到一个新的

ArrayList

中并返回。这使得我们能迅速将一个旧式的数据源转换成一个

List

,进而可以享用

List

提供的诸如

get(index)

subList()

sort()

等丰富操作,甚至可以方便地将其转换为 Stream 进行链式操作。

来看一个简单的例子,假设我们有一个

Hashtable

立即学习“Java免费学习笔记(深入)”;

import java.util.Collections;import java.util.Enumeration;import java.util.Hashtable;import java.util.List;public class EnumerationToListExample {    public static void main(String[] args) {        Hashtable properties = new Hashtable();        properties.put("user", "admin");        properties.put("env", "dev");        properties.put("version", "1.0");        // 获取Enumeration        Enumeration keysEnumeration = properties.keys();        // 使用Collections.list() 转换为List        List keyList = Collections.list(keysEnumeration);        System.out.println("转换后的List: " + keyList);        // 现在可以对List进行各种操作了        keyList.sort(String::compareTo);        System.out.println("排序后的List: " + keyList);        // 或者转换为Stream        keyList.stream().filter(s -> s.startsWith("v")).forEach(System.out::println);    }}

这个方法虽然简单,但其价值在于提供了一个优雅的桥梁,避免了手动循环

while(enumeration.hasMoreElements())

然后

list.add(enumeration.nextElement())

这种略显繁琐的写法。它把这种常见的转换模式封装起来,让代码更简洁,意图更明确。

为什么在现代Java开发中更推荐使用List而非Enumeration?

在现代 Java 开发语境下,

Enumeration

确实显得有些“老派”。它的局限性非常明显,这使得我们倾向于将其转换为

List

或其他

Collection

类型。

Enumeration

是一个只读、单向的迭代器。你只能向前遍历,不能回溯,也没有提供修改底层集合的方法。这与

Iterator

接口的

remove()

方法相比,就显得功能单一。更重要的是,

Enumeration

不支持泛型。虽然在 Java 5 之后,我们可以通过类型推断或强制转换来使用它,但在定义时它是一个原始类型(raw type),这意味着编译时无法提供类型安全检查,运行时可能出现

ClassCastException

。这在强调类型安全的 Java 世界里,无疑是一个短板。

法语写作助手 法语写作助手

法语助手旗下的AI智能写作平台,支持语法、拼写自动纠错,一键改写、润色你的法语作文。

法语写作助手 31 查看详情 法语写作助手

此外,

Enumeration

的 API 相对贫瘠。它只有

hasMoreElements()

nextElement()

两个方法,功能非常基础。而

List

接口,作为

Collection

框架的核心成员,拥有极其丰富的 API,比如按索引访问 (

get(index)

)、添加/删除元素 (

add()

,

remove()

)、查找元素 (

indexOf()

)、子列表 (

subList()

) 等。这些方法极大地提升了我们处理集合数据的效率和灵活性。

再者,

Enumeration

与 Java 8 引入的 Stream API 格格不入。Stream API 旨在提供一种声明式、函数式的数据处理方式,它要求数据源是

Iterable

或可以转换为

Stream

的。

Enumeration

本身并不实现

Iterable

接口,这意味着你不能直接对其调用

stream()

方法。虽然可以通过

Collections.list()

转换成

List

后再调用

stream()

,但这本身就说明了

Enumeration

的“不合时宜”。在需要进行复杂的数据过滤、映射、归约等操作时,

List

结合 Stream API 的优势是

Enumeration

无法比拟的。

所以,将

Enumeration

转换为

List

,不仅仅是语法上的转换,更是拥抱现代 Java 编程范式,享受更强大、更安全、更灵活的集合操作能力。

Collections.list() 的内部实现机制是怎样的?还有哪些手动转换Enumeration到List的方法?

Collections.list()

方法的内部实现其实非常直观,并没有太多魔法。如果你查看 Java 源代码,会发现它大致上就是执行了一个简单的循环:

public static  ArrayList list(Enumeration e) {    ArrayList list = new ArrayList(); // 创建一个新的ArrayList    while (e.hasMoreElements()) {         // 遍历Enumeration        list.add(e.nextElement());        // 将每个元素添加到List中    }    return list;                          // 返回填充好的List}

可以看到,它本质上就是创建了一个新的

ArrayList

,然后通过

Enumeration

hasMoreElements()

nextElement()

方法逐个取出元素并添加到

ArrayList

中。这意味着,这个转换过程的时间复杂度是 O(n),其中 n 是

Enumeration

中元素的数量。它需要遍历所有元素,并为每个元素执行一次

add()

操作。

那么,除了

Collections.list()

,我们还有哪些手动转换的方法呢?其实,最直接的方式就是我们上面提到的

Collections.list()

内部所做的事情——自己写一个循环。

import java.util.ArrayList;import java.util.Enumeration;import java.util.Hashtable;import java.util.List;public class ManualEnumerationToListExample {    public static void main(String[] args) {        Hashtable data = new Hashtable();        data.put("key1", "value1");        data.put("key2", "value2");        Enumeration keysEnum = data.keys();        // 手动转换方法1:使用while循环        List manualList1 = new ArrayList();        while (keysEnum.hasMoreElements()) {            manualList1.add(keysEnum.nextElement());        }        System.out.println("手动转换方法1: " + manualList1);        // 注意:Enumeration是单向的,一旦遍历完就不能再次使用。        // 如果要演示其他方法,需要重新获取Enumeration。        Enumeration keysEnum2 = data.keys();        // 手动转换方法2:如果想更“现代”一点,可以先转为Iterator,再转为List(Java 9+)        // 这种方式通常不会直接用在Enumeration上,因为Collections.list()更直接。        // 但如果有一个老旧的Enumeration,又想用Stream,可以这样:        List manualList2 = new ArrayList();        // 假设这里我们重新获取了 keysEnum2        keysEnum2.asIterator().forEachRemaining(manualList2::add);         System.out.println("手动转换方法2 (Java 9+): " + manualList2);    }}

从性能角度来看,

Collections.list()

和手动

while

循环的性能几乎是一致的,因为

Collections.list()

本质上就是对这种循环的封装。它们都涉及到元素的逐个拷贝。如果你对性能有极致要求,并且知道

Enumeration

的大致大小,可以

以上就是Java中Collections.list方法将Enumeration转List的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/325881.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Claude如何优化核聚变控制 Claude等离子体约束方案
上一篇 2025年11月5日 12:00:23
laravel项目怎么发布到线上(步骤详解)
下一篇 2025年11月5日 12:00:34

相关推荐

  • 如何通过压力测试判断电源的峰值输出可靠性?

    答案是判断电源峰值输出可靠性需通过动态负载测试。使用可编程电子负载模拟瞬时功耗变化,配合高带宽示波器监测电压跌落、恢复时间与纹波噪声,同时用热成像仪评估关键元件温度,若在快速负载切换下电压稳定、纹波低、温升可控,则电源峰值性能可靠。 判断电源的峰值输出可靠性,说白了,就是看它在最极端、最苛刻的瞬间,…

    2026年9月24日
    200
  • 数据库设计原则?——规范化理论

    数据库设计原则?——规范化理论数据库设计原则?——规范化理论数据库设计原则?——规范化理论数据库设计原则?——规范化理论

    数据库设计的规范化理论旨在减少冗余、提升一致性与完整性,核心是通过1nf、2nf、3nf三级范式逐步消除数据异常。1nf要求字段具有原子性,不可再分;2nf要求非主键字段完全依赖主键,而非部分依赖;3nf进一步消除传递依赖,确保非主键字段不依赖其他非主键字段。规范化虽能提高数据可靠性,但可能导致查询…

    2026年9月24日 用户投稿
    000
  • [Istio是什么?] 还不知道你就out了,一文40分钟快速理解

    @toc 前言 这篇文章属于纯理论,所含内容如下,按需阅读: Istio概念、服务网格、流量管理、istio架构(Envoy、Sidecar 、Istiod)虚拟服务(VirtualService)、路由规则、目标规则(DestinationRule)网关(Gateway)、网络弹性和测试(超时、重…

    2026年9月24日
    200
  • VSCode如何分屏和布局管理 VSCode多窗口编辑的高效方式

    vscode多窗口编辑的快捷键和技巧包括:1. 垂直分屏使用 ctrl+(macos为 cmd+);2. 水平分屏使用 ctrl+k v(macos为 cmd+k v)或通过菜单选择上下拆分;3. 拖拽文件标签或从侧边栏拖文件至边缘可智能创建新分屏;4. 右键“在新组中打开”可快速并排查看文件;5.…

    2026年9月24日
    100
  • 深入理解 javac 命令中的 ‘当前目录’ 与类路径

    在使用 javac 命令进行 Java 编译时,’当前目录’ 指的是执行该命令时所在的目录,而非源代码文件或 Java 安装路径所在的目录。这对于默认类路径(.)的解析至关重要,影响编译器查找依赖类文件的位置。理解这一概念有助于避免编译错误,并正确配置类路径。 什么是“当前目…

    2026年9月24日
    100
  • 如何监控Linux进程内存泄漏 pmap与valgrind工具使用

    如何监控Linux进程内存泄漏 pmap与valgrind工具使用如何监控Linux进程内存泄漏 pmap与valgrind工具使用如何监控Linux进程内存泄漏 pmap与valgrind工具使用如何监控Linux进程内存泄漏 pmap与valgrind工具使用

    要监控linux进程的内存泄漏,首先使用pmap观察内存增长趋势,再用valgrind定位具体泄漏点。一、使用pmap -x 查看进程内存映射,重点关注anon列和总内存变化,通过定期刷新判断是否存在异常增长;二、利用valgrind –leak-check=full启动程序,分析报告中…

    2026年9月24日 用户投稿
    100
  • Laravel 表单多动作处理:区分同一路由下的提交操作

    本教程将详细介绍如何在 laravel 应用中,通过一个 html 表单的多个提交按钮触发不同的后端操作,而无需为每个操作创建单独的表单或路由。核心方法是为提交按钮添加 `name` 和 `value` 属性,然后在控制器中根据这些属性的值来判断执行哪种业务逻辑,从而实现如更新用户角色和删除用户等多…

    2026年9月24日
    000
  • 华为Mate系列摄像头如何设置以优化动态摄影?动态拍摄调整指南

    华为Mate系列摄像头如何设置以优化动态摄影?动态拍摄调整指南华为Mate系列摄像头如何设置以优化动态摄影?动态拍摄调整指南华为Mate系列摄像头如何设置以优化动态摄影?动态拍摄调整指南华为Mate系列摄像头如何设置以优化动态摄影?动态拍摄调整指南

    答案是掌握专业模式下的快门速度、ISO和对焦设置,并结合AI辅助与防抖技术。具体而言,拍摄动态场景时应优先选择高速快门(如1/500秒以上)以凝固瞬间,配合AF-C连续对焦与追焦技巧确保主体清晰;在光线不足时适当提升ISO,但需权衡噪点与模糊的取舍;创造运动模糊效果则需降低快门速度(如1/30秒),…

    2026年9月24日 用户投稿
    400
  • mysql中是什么意思 mysql语法符号含义解析

    mysql 中的符号和关键字是与数据库交互的基本工具,正确使用它们可以提高工作效率和查询准确性。1. 逗号(,)用于分隔列表中的元素,如列名和值。2. 点号(.)用于访问表中的列或调用函数。3. 星号(*)用于选择所有列,但应避免使用以提高查询性能。4. 百分号(%)用于 like 操作中的模式匹配…

    2026年9月24日
    000
  • Spring Boot 测试中 403 错误排查与安全配置优化

    本文旨在解决 Spring Boot 控制器层测试中常见的 403 Forbidden 错误,特别是当安全配置限制了访问权限时。文章将深入分析 WebSecurityConfig 和 @WithMockUser 的使用,提供两种主要解决方案:通过临时放松安全限制进行测试,以及确保角色/权限配置的正确…

    2026年9月24日
    100
  • MAC怎么把App的语言单独设置成中文或英文_MAC单独设置App语言方法

    可通过终端命令临时设置或修改应用Info.plist文件永久更改macOS单个应用语言,支持中英文切换,不影响系统语言。 如果您希望在 macOS 系统中将某个应用程序的语言单独设置为中文或英文,而不影响系统整体语言,可以通过修改应用的本地化偏好来实现。此方法适用于支持多语言且遵循 macOS 本地…

    2026年9月24日
    000
  • 显卡降噪散热测试:七款RTX 4080非公版显卡谁更安静?

    选择RTX 4080显卡时,在性能相近的情况下,散热与噪音成为关键考量。1. 散热模组决定温度与风扇转速,进而影响噪音水平;2. 三风扇设计、大面积均热板及多热管(如6mm×8根)能有效提升散热效率;3. 七彩虹水神(Neptune)等一体水冷型号静音表现顶尖,高负载下亦可近乎无声;4. 映众冰龙、…

    2026年9月24日
    000
  • DeepCode— 港大实验室推出的多Agent代码生成平台

    DeepCode— 港大实验室推出的多Agent代码生成平台DeepCode— 港大实验室推出的多Agent代码生成平台DeepCode— 港大实验室推出的多Agent代码生成平台DeepCode— 港大实验室推出的多Agent代码生成平台

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ MiniMax Agent MiniMax平台推出的Agent智能体助手 334 查看详情 DeepCode是什么 deepcode是由香港大学数据智能实验室研发的一款基于多智能体架构的智能代码…

    2026年9月24日 用户投稿
    200
  • 时区错误怎样校准?时间同步完整解决方法

    时区错误怎样校准?时间同步完整解决方法时区错误怎样校准?时间同步完整解决方法时区错误怎样校准?时间同步完整解决方法时区错误怎样校准?时间同步完整解决方法

    时区错误和时间同步问题通常由系统时区设置错误、硬件时钟漂移或ntp服务异常导致。1.确保系统时间通过ntp服务准确同步,linux可使用timedatectl检查ntp状态并启用systemd-timesyncd或chronyd,windows则开启自动时间同步;2.正确设置本地时区,linux使用…

    2026年9月24日 用户投稿
    200
  • VSCode如何实现代码模式识别 VSCodeAI辅助重构的智能技巧

    ai辅助重构在vscode中依赖lsp解析代码结构并结合ai模型识别模式,1. 首先通过语言服务器协议(lsp)构建抽象语法树,获取变量、函数、作用域等语义信息;2. 然后利用大型语言模型(如github copilot)基于上下文和训练数据预测重构建议;3. 用户可通过右键菜单或快捷键(ctrl+…

    2026年9月24日
    900
  • FramePackLoop— AI视频生成工具,首尾连接生成循环视频

    FramePackLoop— AI视频生成工具,首尾连接生成循环视频FramePackLoop— AI视频生成工具,首尾连接生成循环视频FramePackLoop— AI视频生成工具,首尾连接生成循环视频FramePackLoop— AI视频生成工具,首尾连接生成循环视频

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ Q.AI视频生成工具 支持一分钟生成专业级短视频,多种生成方式,AI视频脚本,在线云编辑,画面自由替换,热门配音媲美真人音色,更多强大功能尽在QAI 73 查看详情 FramePackLoop是…

    2026年9月24日 用户投稿
    200
  • Flyway多数据库与多环境配置:实现测试与生产环境的灵活迁移管理

    本文深入探讨了Flyway在多数据库和多环境场景下的灵活配置策略,旨在解决开发、开发、测试与生产环境数据库迁移的挑战。文章首先分析了测试环境数据库选择的推荐方案,包括使用与生产一致的数据库服务或Testcontainers。随后,详细阐述了Flyway如何通过分离配置文件、编程化配置以及利用占位符来…

    2026年9月24日
    100
  • laravel怎么使用Str和Arr辅助类的常用方法_laravel Str/Arr辅助类常用方法教程

    Laravel的Str和Arr类提供字符串与数组处理方法,如Str::lower、Str::contains、Arr::get、Arr::pluck等,提升代码可读性与开发效率。 Laravel 提供了两个非常实用的辅助类 Str 和 Arr,用于处理字符串和数组。它们封装了许多常用操作,让代码更简…

    2026年9月24日
    000
  • VS Code微服务开发:Docker与Kubernetes集成

    VS Code通过Docker扩展实现本地容器化开发,支持自动生成Dockerfile、一键构建镜像及devcontainer环境一致性;2. Kubernetes扩展可连接集群并管理资源,结合Bridge to Kubernetes实现本地调试与集群网络集成;3. 使用Skaffold自动化构建部…

    2026年9月24日
    100
  • 使用正则表达式从JSON数组中提取JSON对象

    本文旨在提供一种使用Java正则表达式从包含多个JSON对象的JSON数组中提取单个JSON对象的方法。我们将详细介绍如何构建合适的正则表达式,并提供示例代码演示如何在Java中使用该表达式来实现JSON对象的提取,并对提取后的字符串进行优化处理,移除不必要的空白字符。 从JSON数组中提取JSON…

    2026年9月24日
    000

发表回复

登录后才能评论
关注微信