繁体   English   中英

Java中的String类没有反向方法?

[英]No reverse method in String class in Java?

为什么Java中的String类中没有反向方法? 相反,在StringBuilder提供了reverse()方法? 是否有一个原因? 但String有split()regionMatches()等,它们比reverse()方法更复杂。

当他们添加这些方法时,为什么不添加reverse()

因为你在StringBuilder中有它,所以在String中不需要它,对吧? :-)

说真的,在设计API时,你可以包含很多东西。 然而,为了简单和清楚起见,有意地保持接口小。 谷歌在“API设计”上,你会发现大量 网页都同意这一点。

如果你真的需要它,你就是这样做的:

str = new StringBuilder(str).reverse().toString();

如果您需要历史原因,String在Java中是不可变的,即如果不创建另一个String,则无法更改给定的String。

虽然这本身并不坏“,但Java的初始版本错过了像StringBuilder这样的类。 相反,String本身包含(并且仍然包含)许多“改变”String的方法,但由于String是不可变的,因此这些方法中的每一个实际上都创建并返回一个NEW String对象。

这导致了简单的表达式:

String s = "a" + anotherString.substr(10,5).trim().toLowerCase();

实际上在ram中创建类似于5个字符串的东西,其中4个绝对无用,具有明显的性能问题(尽管已经对底层char []数组进行了一些优化)。

为了解决这个问题,Sun引入了StringBuilder和其他不可变的类。 这些类可以自由修改单个char []数组,因此调用方法不需要生成许多中间String实例。

他们最近添加了“反向”,所以他们将它添加到StringBuilder而不是String,因为它现在是操作字符串的首选方式。

从理论上讲,String可以提供它并只返回正确的结果作为新的String。 当您了解Java基础库时,它只是一个设计选择。

字符串是不可变的,这意味着它不能被更改。

当你反转一个字符串时,发生的事情就是每个字母都是自己打开的,这意味着它每次都会创建新的对象。

让我们看看示例:这意味着例如Hello变为如下

  • elloH lloeH loleH olleH

并最终在堆上有4个新的String对象。 所以想想如果你有数千个字符串或更多字符串,那么将创建多少对象......这将是非常昂贵的。 所以会占用太多的内存。

所以因为这个String类没有reverse()方法。

嗯,我认为这可能是因为它是一个immutable类,所以如果我们有一个反向方法,它实际上会创建一个新对象。

作为旁注,在Scala中你使用相同的java.lang.String类,你会得到一个reverse方法(以及各种其他方便的东西)。 它的方式是使用隐式转换 ,以便您的String自动转换为具有reverse方法的类。 它非常聪明,并且不需要使用数百种方法来膨胀基类。

reverse()作用于此 ,修改当前对象,String对象是不可变的 - 它们不能被修改。

在原位执行reverse()是特别有效的 - 已知大小是相同的,因此不需要分配,循环迭代的数量是副本中的一半,而对于大字符串,内存位置是最佳。 通过查看代码,我们可以看到为了加快速度而采取了很多措施。 我怀疑作者有一个特定的用例需要高性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM