Java Properties 遍历方法详解

Java Properties 遍历方法详解

在 Java 中遍历 Properties 对象有多种方式,以下是完整的遍历方法及其适用场景:


1. 标准遍历方法

(1)通过 keySet() 遍历

java

java 复制代码
Properties props = new Properties();
props.load(new FileInputStream("config.properties"));

// 遍历所有键
for (String key : props.stringPropertyNames()) {
    String value = props.getProperty(key);
    System.out.println(key + " = " + value);
}
  • 特点 :直接获取所有键名(String 类型),避免类型转换。

(2)通过 entrySet() 遍历(需类型转换)

java

java 复制代码
for (Map.Entry<Object, Object> entry : props.entrySet()) {
    String key = (String) entry.getKey();
    String value = (String) entry.getValue();
    System.out.println(key + " = " + value);
}
  • 注意 :需要手动将 Object 转为 String(因为 Properties 继承自 Hashtable<Object,Object>)。

2. Java 8+ 简化遍历

(1)使用 forEach() 方法

java

java 复制代码
props.forEach((key, value) -> 
    System.out.println(key + " = " + value)
);
  • 优势:代码简洁,但仍需类型转换:

    java

java 复制代码
props.forEach((k, v) -> {
    String key = (String) k;
    String value = (String) v;
    System.out.println(key + " : " + value);
});

(2)通过 stringPropertyNames() + Lambda

java

java 复制代码
props.stringPropertyNames()
      .forEach(key -> System.out.println(key + " -> " + props.getProperty(key)));
  • 推荐:无需类型转换,直接操作字符串键值。

3. 枚举遍历(旧版兼容)

java

java 复制代码
Enumeration<?> names = props.propertyNames();
while (names.hasMoreElements()) {
    String key = (String) names.nextElement();
    String value = props.getProperty(key);
    System.out.println(key + " = " + value);
}
  • 适用场景:兼容 JDK 1.0 的老代码,现代开发中不推荐。

4. 遍历时注意事项

  1. 键值类型:

    • Properties 的键值实际存储为 Object,但设计上应为 String。

    • 使用 stringPropertyNames() 可避免类型转换。

  2. 默认值处理:

    java

    复制代码
    // 获取带默认值的属性
    String value = props.getProperty("non_existent_key", "default_value");
  3. 线程安全:

    • Properties 继承自 Hashtable,是线程安全的,但遍历时若并发修改可能抛 ConcurrentModificationException。

5. 完整示例

java

java 复制代码
import java.io.*;
import java.util.Properties;

public class PropertiesTraversal {
    public static void main(String[] args) throws IOException {
        Properties props = new Properties();
        props.load(new FileInputStream("config.properties"));

        // 方法1:stringPropertyNames()
        System.out.println("--- 方法1 ---");
        for (String key : props.stringPropertyNames()) {
            System.out.println(key + " = " + props.getProperty(key));
        }

        // 方法2:Java 8 forEach
        System.out.println("--- 方法2 ---");
        props.forEach((k, v) -> System.out.println(k + " : " + v));

        // 方法3:entrySet()
        System.out.println("--- 方法3 ---");
        props.entrySet().forEach(entry -> 
            System.out.println(entry.getKey() + " -> " + entry.getValue())
        );
    }
}

6. 性能对比

方法 可读性 类型安全 适用场景
stringPropertyNames() ★★★★★ ★★★★★ 推荐(无类型转换)
forEach() ★★★★☆ ★★★☆☆ Java 8+ 简洁写法
entrySet() ★★★☆☆ ★★☆☆☆ 需手动类型转换
propertyNames() ★★☆☆☆ ★★☆☆☆ 老旧代码兼容

7. 记忆技巧

"遍历 Properties 三件宝:
stringPropertyNames() 最稳妥,
forEach() 写起来少,

老旧系统才用枚举搞。"


8. 面试常见问题

  1. Properties 的键值是什么类型?

    • 存储时为 Object,但约定应为 String。
  2. 如何安全遍历 Properties?

    • 优先用 stringPropertyNames(),避免类型转换问题。
  3. Properties 和 Map 的遍历有何区别?

    • Properties 提供专用的 stringPropertyNames(),而 Map 需用 keySet() 或 entrySet()。

9. 实战建议

  • 推荐 :始终使用 stringPropertyNames() 遍历,避免类型转换陷阱。

  • 复杂场景:若需过滤或处理键值,可用 Stream API:

    java

    复制代码
    props.stringPropertyNames().stream()
         .filter(key -> key.startsWith("db."))
         .forEach(key -> System.out.println(key));

如果需要处理更复杂的配置(如嵌套结构),建议转为 YAML/JSON 并使用相应库(如 SnakeYAML 或 Gson)。

相关推荐
H_BB4 分钟前
面试笔记:数据加密和心跳机制
笔记·面试·职场和发展
QianhangQianping8 分钟前
撤销重做不是「存快照」:一个可视化编辑器的Operation 设计
java·前端·数据库·typescript·编辑器·前端架构·撤销重做
海绵宝宝转agent14 分钟前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
SunnyDays101115 分钟前
Java 操作 Word 脚注和尾注:添加、读取与删除
java·word
SunnyDays101116 分钟前
Java 为 Word 添加页码:隐藏封面页码、从指定页开始编号、奇偶页页码设置等
java·word·页码
octopus_c20 分钟前
C++ 运算符重载详解 && 日期类的实现
开发语言·c++
开源推荐官20 分钟前
多门店 O2O 商城选型复盘:从开发视角对比主流开源系统
java·架构·开源·php
吴名氏.21 分钟前
Java转AI Agent教程(第二周)超时重试与错误分类
java·人工智能·python·分类·ai agent
青少儿编程课堂23 分钟前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛
Eiceblue24 分钟前
用 Python 给 Word 文档加水印:文字、图片与批量处理
开发语言·vscode·python·word