加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 关于反转字符串的问题

发布时间:2020-12-15 05:16:42 所属栏目: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.ou
我正在尝试做一个简单的字符串操作.输入是“谋杀”,我想得到“谋杀”.

我试过这个

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?
> Fluent Interfaces – Method Chaining

附录:StringBuffer vs StringBuilder

而不是StringBuffer,你通常应该更喜欢StringBuilder,它更快,因为它不同步.上面的大多数讨论也适用于StringBuilder.

从文档:

07003 : A thread-safe,mutable sequence of characters. […] As of JDK 5,this class has been supplemented with an equivalent class designed for use by a single thread,StringBuilder,which should generally be preferred as it supports all of the same operations but faster,as it performs no synchronization.

07004 : A mutable sequence of characters. […] Instances of StringBuilder are not safe for use by multiple threads. If such synchronization is required then it is recommended that StringBuffer be used.

相关问题

> 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"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读