gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 04:06:58 26 4
gpt4 key购买 nike

我正在尝试进行简单的字符串操作。输入是“murder”,我想得到“murderredrum”。

我试过了

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() 不会返回一个新的 StringBuffer,它是 buf 的反转。它在反转自身后返回 buf!

有很多方法可以“解决”这个问题,但最简单的方法是显式创建一个新的 StringBuffer 用于反转,所以像这样:

buf.append(new StringBuffer(str).reverse());

更深入的洞察:比较 StringStringBuffer

Java 中的

String不可变的。另一方面,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,但它们返回调用它的同一实例!它们NOT 返回一个新的 StringBuffer 实例。事实上,您可以随意丢弃“结果”,因为这些方法已经通过对其调用的实例的各种突变(即副作用)完成了它们所做的事情。

这些方法可能被声明为void,但它们本质上返回这个;的原因是因为它促进了 method chaining ,允许你写这样的东西:

sb.append(thisThing).append(thatThing).append(oneMoreForGoodMeasure);

相关问题


附录:StringBufferStringBuilder

StringBuffer 不同,您通常应该更喜欢 StringBuilder,它更快,因为它不是同步。上面的大部分讨论也适用于 StringBuilder

来自文档:

StringBuffer : 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.

StringBuilder : 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.

相关问题


奖励 Material !替代解决方案!

这里有一个可能更易读的问题的替代“修复”:

StringBuilder word = new StringBuilder("murder");
StringBuilder worddrow = new StringBuilder(); // starts empty

worddrow.append(word).append(word.reverse());

System.out.println(worddrow); // "murderredrum"

请注意,虽然这对于短字符串应该很好,但它确实使用了额外的缓冲区,这意味着它不是解决问题的最有效方法。

相关问题


又是奖励 Material !笑到最后!

StringBuilder sb = new StringBuilder("ha");
sb.append(sb.append(sb));
System.out.println(sb); // "hahahaha"

关于java - 关于反转字符串的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3379681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com