[英]No reverse method in String class in Java?
为什么Java中的String
类中没有反向方法? 相反,在StringBuilder
提供了reverse()
方法? 是否有一个原因? 但String有split()
, regionMatches()
等,它们比reverse()
方法更复杂。
当他们添加这些方法时,为什么不添加reverse()
?
如果您需要历史原因,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变为如下
并最终在堆上有4个新的String对象。 所以想想如果你有数千个字符串或更多字符串,那么将创建多少对象......这将是非常昂贵的。 所以会占用太多的内存。
所以因为这个String类没有reverse()方法。
嗯,我认为这可能是因为它是一个immutable
类,所以如果我们有一个反向方法,它实际上会创建一个新对象。
作为旁注,在Scala中你使用相同的java.lang.String
类,你会得到一个reverse
方法(以及各种其他方便的东西)。 它的方式是使用隐式转换 ,以便您的String
自动转换为具有reverse
方法的类。 它非常聪明,并且不需要使用数百种方法来膨胀基类。
reverse()作用于此 ,修改当前对象,String对象是不可变的 - 它们不能被修改。
在原位执行reverse()是特别有效的 - 已知大小是相同的,因此不需要分配,循环迭代的数量是副本中的一半,而对于大字符串,内存位置是最佳。 通过查看代码,我们可以看到为了加快速度而采取了很多措施。 我怀疑作者有一个特定的用例需要高性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.