如何让Java加密方法中的字符替换功能按照预期正常生效?
代码问题原因
- Java中
String是不可变对象,调用replace()方法不会修改原字符串,只会返回替换后的新字符串,你的代码没有接收该返回值,所有替换操作实际都未生效。 - 你直接修改了入参
offset的值,每处理一个字符就覆盖了原始偏移量,导致后续字符的偏移计算全部错误。 String.replace()是全局替换规则,会修改字符串中所有匹配的字符,而非仅修改当前循环位置的字符,存在重复字符时替换结果会完全错乱。- 双层循环遍历字母表匹配字符的实现效率极低,可直接通过
indexOf方法定位字符位置,无需额外遍历。
修正后代码
public static String encrypt(String message, int offset){ // 兼容负偏移量的情况,不需要可删除 offset = offset % 27; if (offset < 0) { offset += 27; } StringBuilder encrypted = new StringBuilder(message.toUpperCase()); String alphabet = " ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for (int i = 0; i < encrypted.length(); i++) { char currentChar = encrypted.charAt(i); int charIndex = alphabet.indexOf(currentChar); // 仅处理字母表中存在的字符,不在表内的字符保持原样 if (charIndex != -1) { int targetIndex = (charIndex + offset) % 27; encrypted.setCharAt(i, alphabet.charAt(targetIndex)); } } return encrypted.toString(); }
核心修改说明
- 用可变的
StringBuilder存储待加密字符串,支持按位修改字符,避免不可变String频繁创建对象的问题,同时规避全局替换的错误。 - 不修改原始入参
offset,用临时变量计算每个字符的目标位置,保证偏移规则统一。 - 移除冗余的内层字母表遍历逻辑,用
indexOf直接定位字符位置,大幅提升执行效率。
内容的提问来源于stack exchange,提问作者Sergio Chong
相关产品推荐
相关产品推荐

