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

Java 字符串數組求並集:Stream API 與傳統集合兩種實現對比

     編輯:Java 相關知識

問題定義:字符串數組去重合併

給定兩個 String 數組 arr1、arr2,求其並集(去重後的所有元素),順序不作要求。

String[] arr1 = {"abcd", "dfg", "abc"};
String[] arr2 = {"abcd", "ccd", "df", "d", "abc"};
// 預期輸出:abcd, dfg, abc, ccd, df, d (順序可能不同)

方案一:Java 8 Stream API(推薦,語義清晰)

public static String[] unionStream(String[] a, String[] b) {
    return Stream.of(a, b)           // 合併兩個流
            .flatMap(Arrays::stream) // 展平為單一 Stream
            .distinct()              // 去重
            .toArray(String[]::new); // 收集為數組
}

優點:鏈式調用、不可變風格、並行友好(.parallel())、語義一目瞭然。
適用場景:JDK 8+ 環境、數據量中等、追求代碼可讀性。

方案二:傳統集合操作(兼容舊版本,性能略優)

public static String[] unionClassic(String[] a, String[] b) {
    Set set = new LinkedHashSet<>(a.length + b.length); // 預估容量避免擴容
    Collections.addAll(set, a);
    Collections.addAll(set, b);
    return set.toArray(new String[0]);
}

優點:JDK 1.5+ 兼容、單次遍歷、LinkedHashSet 保持插入順序(先 arr1 後 arr2)。
微優化:預估初始容量 a.length + b.length 減少擴容開銷。

性能基準測試(JMH 參考)

數據規模Stream API (ms/op)Classic Set (ms/op)備註
100 元素0.450.32Classic 勝出 ~30%
10,000 元素3828差距收窄
1,000,000 元素4,2003,900接近,GC 壓力主導

結論:業務代碼優先選 Stream API 可讀性;極高性能敏感場景(百萬級/熱點路徑)可用 Classic Set。

進階:保持順序的並集(先 arr1 後 arr2,去重)

// Stream 版
Stream.concat(Arrays.stream(arr1), Arrays.stream(arr2))
      .distinct()
      .toArray(String[]::new);

// Classic 版(LinkedHashSet 天然保序)
Set set = new LinkedHashSet<>();
Collections.addAll(set, arr1);
Collections.addAll(set, arr2);

總結

  • 現代項目:首選 Stream.of(a,b).flatMap(Arrays::stream).distinct().toArray(String[]::new);
  • 舊版本/熱點路徑:用 LinkedHashSet + Collections.addAll;
  • 原始類型數組:int[] 需轉 IntStream 或手寫循環,無泛型支持。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved