java中对string去重并保持原始顺序的核心方法是:遍历字符串仅保留首次出现的字符,推荐用linkedhashset(维持插入顺序且自动去重),或stringbuilder+hashset(更省内存),亦可用stream配合linkedhashset收集,注意大小写敏感及null/空字符串校验。

Java 中对 String 去重并保持原始字符顺序,核心思路是:遍历字符串,只保留**第一次出现**的字符,跳过后续重复项。关键在于用一个结构记录已见字符,同时按遍历顺序拼接结果。
用 LinkedHashSet 保证顺序 + 去重
推荐方法,简洁高效,语义清晰。 LinkedHashSet 内部基于 LinkedHashMap,天然维持插入顺序,且自动去重。
- 将字符串转为 char 数组或用 chars() 流处理
- 逐个添加到 LinkedHashSet —— 重复字符会被忽略,顺序由首次出现位置决定
- 再遍历 set 构建新字符串(注意:LinkedHashSet 的迭代顺序 = 插入顺序)
示例代码:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
String s = "abacbad";
LinkedHashSet<character> seen = new LinkedHashSet();
for (char c : s.toCharArray()) {
seen.add(c);
}
String result = seen.stream()
.map(String::valueOf)
.collect(Collectors.joining()); // "abcd"</character>
用 StringBuilder + HashSet 手动控制
更底层、内存更省,适合对性能敏感或需精细控制的场景。
- 用 HashSet 记录已出现的字符(O(1) 查重)
- 用 StringBuilder 按遍历顺序追加“首次见到”的字符
- 避免创建中间集合,空间开销略小
示例代码:
String s = "abacbad";
Set<character> seen = new HashSet();
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (seen.add(c)) { // add() 返回 true 表示首次添加成功
sb.append(c);
}
}
String result = sb.toString(); // "abcd"</character>
用 Java 8 Stream(一行写法,但注意顺序)
函数式风格,可读性好,但需确保使用 LinkedHashSet 收集,否则普通 Collectors.toSet() 不保序。
- s.chars().mapToObj(c -> (char) c) 转为字符流
- 用 Collectors.toCollection(LinkedHashSet::new) 保证顺序
- 再转回字符串
示例代码:
String s = "abacbad";
String result = s.chars()
.mapToObj(c -> (char) c)
.collect(Collectors.collectingAndThen(
Collectors.toCollection(LinkedHashSet::new),
set -> set.stream()
.map(String::valueOf)
.collect(Collectors.joining())
)); // "abcd"
注意事项
区分大小写:'A' 和 'a' 视为不同字符;如需忽略大小写,先统一转成 toLowerCase() 再处理。
空字符串或 null 需提前判空,避免 NPE。
中文、emoji 等 Unicode 字符正常支持(char 是 UTF-16 单元,对 BMP 字符没问题;若含代理对,建议改用 codePoint 方式遍历)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










