为什么Java中的String
类没有反向方法?相反,reverse()
中提供了StringBuilder
方法?是否有一个原因?但String有split()
,regionMatches()
等,它们比reverse()
方法更复杂。
当他们添加这些方法时,为什么不添加reverse()
?
答案 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 变为如下
你最终在堆上有4个新的String对象。 所以想想如果你有数千个字符串或更多字符串,那么将创建多少对象......这将是非常昂贵的。所以会占用太多的内存。
因为这个String类没有reverse()方法。
答案 6 :(得分:-1)
reverse()作用于 this ,修改当前对象,String对象是不可变的 - 它们不能被修改。
做反向()原位是特别有效的 - 已知大小相同,因此不需要分配,循环迭代的数量是副本中的一半,对于大字符串,内存局部性是最佳的。通过查看代码,我们可以看到为了加快速度而采取了很多措施。我怀疑作者有一个特定的用例需要高性能。