如何使用StringBuilder改写添加@前缀的用户名高亮代码?
用StringBuilder实现用户名高亮功能
先搞懂StringBuilder的核心逻辑
String是不可变的,每次调用replace、+这类操作都会生成新的String对象,频繁操作时会浪费内存、拖慢效率。而StringBuilder是可变字符序列,它内部用字符数组存储内容,修改时直接在数组里操作,不会频繁创建新对象,性能更优。
用StringBuilder实现的代码
public String highlightUsernames(String tweetText, String[] usernames) { // 将原始字符串转为StringBuilder,方便后续修改操作 StringBuilder sb = new StringBuilder(tweetText); // 遍历所有待处理的用户名 for (String username : usernames) { int index = sb.indexOf(username); // 循环查找所有匹配的用户名,避免仅替换第一个匹配项 while (index != -1) { // 在匹配到的用户名前插入@前缀 sb.insert(index, "@"); // 移动索引位置,跳过已处理的内容,避免重复替换 index = sb.indexOf(username, index + username.length() + 1); } } return sb.toString(); }
和原String版本的差异
原代码使用String.replace()时,每次循环都会生成新的String对象,产生大量中间垃圾。而StringBuilder版本全程仅在一个对象内操作,无多余对象创建,处理长文本或大量用户名时,性能优势会非常明显。
额外提示:如果用户名存在包含关系(比如"Trump"和"DonaldTrump"),建议先对usernames数组按字符串长度倒序排序再遍历,避免短用户名先被替换导致长用户名无法匹配。
内容的提问来源于stack exchange,提问作者Jorge D. García
相关产品推荐
相关产品推荐

