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

时间:2011-09-14 17:27:28

标签: java string stringbuilder

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

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

7 个答案:

答案 0 :(得分:28)

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

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

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

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

答案 1 :(得分:3)

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

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

这导致了简单的表达式,如:

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

作为附注,在Scala中,您使用相同的java.lang.String类,并且您获得了reverse方法(以及各种其他方便的东西)。它的工作方式是使用隐式转换,这样您的String就会自动转换为具有reverse方法的类。它真的很聪明,并且不需要用数百种方法来膨胀基类。

答案 5 :(得分:0)

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

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

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

  • elloH lloeH loleH olleH

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

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

答案 6 :(得分:-1)

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

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