java – 关于反转字符串的问题
我正在尝试做一个简单的字符串操作.输入是“谋杀”,我想得到“谋杀”.
我试过这个 String str = "murder"; StringBuffer buf = new StringBuffer(str); // buf is now "murder",so i append the reverse which is "redrum" buf.append(buf.reverse()); System.out.println(buf); 但现在我得到“redrumredrum”而不是“murderredrum”. 谁能解释我的程序有什么问题?谢谢. 解决方法
简短的回答
这条线: buf.append(buf.reverse()); 基本上做以下事情: buf.reverse(); // buf is now "redrum" buf.append(buf); 这就是你得到“redrumredrum”的原因. 也就是说,buf.reverse()不会返回一个与buf相反的新StringBuffer.在它反转之后它返回buf! 有很多方法可以“修复”这个,但最简单的方法是为反转显式创建一个新的StringBuffer,如下所示: buf.append(new StringBuffer(str).reverse()); 深入洞察:比较String和StringBuffer Java中的字符串是不可变的.另一方面,StringBuffer是可变的(这就是为什么你可以,除其他外,可以附加东西). 这就是为什么使用String,转换方法确实会返回一个新的String.这就是为什么这样的事情是“错误的” String str = "murder"; str.toUpperCase(); // this is "wrong"!!! System.out.println(str); // still "murder" 相反,你想做: String str = "murder"; str = str.toUpperCase(); // YES!!! System.out.println(str); // now "MURDER"!!! 但是,情况与StringBuffer类似.大多数StringBuffer方法都返回StringBuffer,但它们返回的是与之相同的实例!它们不返回新的StringBuffer实例.实际上,你可以自由地丢弃“结果”,因为这些方法已经完成了它们通过各种突变(即副作用)对它所调用的实例所做的事情. 这些方法可能被宣布为无效,但它们基本上归还了这个原因;相反是因为它促进method chaining,允许你写如下: sb.append(thisThing).append(thatThing).append(oneMoreForGoodMeasure); 相关问题 > Method chaining – why is it a good practice,or not? 附录:StringBuffer vs StringBuilder 而不是StringBuffer,你通常应该更喜欢StringBuilder,它更快,因为它不同步.上面的大多数讨论也适用于StringBuilder. 从文档:
相关问题 > StringBuilder and StringBuffer in Java 奖金材料!替代方案! 这是对问题的另一种“修复”,可能更具可读性: StringBuilder word = new StringBuilder("murder"); StringBuilder worddrow = new StringBuilder(); // starts empty worddrow.append(word).append(word.reverse()); System.out.println(worddrow); // "murderredrum" 请注意,虽然这对短字符串应该没问题,但它确实使用了额外的缓冲区,这意味着它不是解决问题的最有效方法. 相关问题 > Reverse a string in Java,in O(1)? – 作为CharSequence,是的,这可以做到! 奖金材料再次!笑到最后! StringBuilder sb = new StringBuilder("ha"); sb.append(sb.append(sb)); System.out.println(sb); // "hahahaha" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |