system.getproperties()返回java.util.properties类型,是继承自hashtable的线程安全键值对集合,所有键和值均为string类型。

System.getProperties() 返回的是什么类型
System.getProperties() 返回的是 java.util.Properties,它继承自 Hashtable<object object></object>,本质是一个线程安全的键值对集合,所有 key 和 value 都是 String 类型(尽管泛型擦除后是 Object,但实际存入的全是字符串)。
直接遍历时不能用 for (Object o : props.keySet()) 然后强转——虽然能跑通,但 IDE 会警告,且违背契约。正确做法是明确按 String 处理 key 和 value。
最简安全的遍历写法
推荐用增强 for 配合 entrySet(),避免重复查表、类型模糊和并发修改风险:
Properties props = System.getProperties();
for (Map.Entry<object object> entry : props.entrySet()) {
String key = (String) entry.getKey();
String value = (String) entry.getValue();
System.out.println(key + " = " + value);
}</object>
注意:这里用 Map.Entry<object object></object> 是因为 Properties 没有泛型重载的 entrySet() 方法(Java 8 及以前),强制转型是当前最稳妥的写法。Java 9+ 虽有 String getProperty(String) 等便利方法,但遍历仍需如此。
- 别用
props.list(System.out):输出格式不可控,带缩进和换行,不适合后续解析或日志采集 - 别用
props.stringPropertyNames()再逐个 get:多一次哈希查找,性能略差,且对 null 值不友好(虽然系统属性一般没有 null value) - 如果要过滤,比如只看以
java.开头的,直接在循环内加if (key.startsWith("java."))
常见干扰项:为什么看不到 -D 参数设置的某些值
不是所有命令行传入的 -Dkey=value 都会出现在 System.getProperties() 中:
-
-Dfile.encoding=UTF-8这类会立刻生效并写入,可见 -
-Dsun.java.command=...是 JVM 自动注入的,也可见 - 但像
-XX:+UseG1GC这类 JVM 启动参数,不属于「系统属性」,不会出现——它们由 JVM 内部解析,不经过Properties机制 - 某些安全策略下,部分敏感 key(如
user.home)可能被屏蔽,但 JDK 默认不会
输出中文乱码怎么办
如果控制台显示中文 value 是问号或方块,问题不在 System.getProperties(),而在终端编码或 IDE 控制台配置:
- Linux/macOS 终端检查
locale输出是否含UTF-8 - IntelliJ IDEA:Settings → Editor → File Encodings → “Project Encoding” 和 “Default encoding for properties files” 都设为 UTF-8
- Windows CMD 默认是 GBK,建议改用 PowerShell 或启动时加
chcp 65001 -
System.getProperty("file.encoding")查到的值只是 JVM 启动时读取的默认编码,不代表控制台能正确渲染
真正需要稳定输出中文路径或描述,建议用 java.nio.charset.StandardCharsets.UTF_8 显式编码再打印到文件,而不是依赖控制台。











