首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java Properties 遍歷三大方法:鍵集、值集、鍵值對集合

     編輯:Java 相關知識

Properties 繼承 Hashtable 的三種遍歷方式

java.util.Properties 繼承 Hashtable<Object, Object>,可用 Map 介面方法遍歷,也有專屬 propertyNames()。

準備工作:載入屬性檔

Properties props = new Properties();
try (InputStream in = ClassLoader.getSystemResourceAsStream("wahaha.properties")) {
    props.load(in);
} catch (IOException e) {
    e.printStackTrace();
}

假設 wahaha.properties 內容

name1=xxxx
name2=yyyyy
name3=zzzzzzz

方法一:propertyNames() - 專屬鍵枚舉 (推薦)

Enumeration<?> keys = props.propertyNames(); // 僅返回 String 鍵
while (keys.hasMoreElements()) {
    String key = (String) keys.nextElement();
    System.out.println("Key: " + key);
    // 取值:props.getProperty(key)
}
輸出:
Key: name1
Key: name2
Key: name3
  • 返回 Enumeration<String> (實際為 Enumeration<?>),類型安全。
  • 僅包含字串鍵,忽略非字串鍵 (Hashtable 允許)。

方法二:elements() - 繼承自 Hashtable 的值枚舉

Enumeration<?> values = props.elements(); // 返回所有值 (Object)
while (values.hasMoreElements()) {
    String value = (String) values.nextElement();
    System.out.println("Value: " + value);
}
輸出:
Value: xxxx
Value: yyyyy
Value: zzzzzzz
  • 返回所有值,順序與鍵對應但無法直接取得鍵名。
  • 若 Properties 被塞入非 String 值,轉型會拋 ClassCastException。

方法三:entrySet() - Map 介面標準鍵值對遍歷 (最通用)

for (Map.Entry<Object, Object> entry : props.entrySet()) {
    Object key = entry.getKey();
    Object value = entry.getValue();
    System.out.println(key + " = " + value);
}
輸出:
name1 = xxxx
name2 = yyyyy
name3 = zzzzzzz
  • 返回 Set<Map.Entry<Object, Object>>,可同時獲取鍵值。
  • 支援 Java 5+ 增強 for 迴圈,程式碼最簡潔。
  • 鍵值類型為 Object,需轉型或 toString()。

三種方式對比

方法返回類型可獲取鍵可獲取值類型安全適用場景
propertyNames()Enumeration✅需額外 getProperty鍵為 String僅需遍歷鍵名
elements()Enumeration❌✅值為 String僅需遍歷值
entrySet()Set<Entry>✅✅Object (需轉型)需同時處理鍵值 (最常用)

現代寫法:Java 8+ Stream API

// 僅字串鍵值
props.stringPropertyNames().stream()
    .forEach(key -> System.out.println(key + "=" + props.getProperty(key)));

// 完整 Entry Stream
props.entrySet().stream()
    .forEach(e -> System.out.println(e.getKey() + "=" + e.getValue()));

最佳實踐建議

  1. **首選 entrySet() 或 stringPropertyNames()**:API 清晰、支援 Stream。
  2. 避免使用 elements():無法獲取鍵、類型不安全。
  3. 遍歷時**勿修改** Properties (刪除/新增),會拋 ConcurrentModificationException;需先收集鍵再操作。
  4. 屬性檔編碼:JDK 9+ load(Reader) 支援 UTF-8;舊版需自行轉碼 (ISO-8859-1 → UTF-8)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved