Нет метода обратного преобразования в классе String в Java?
Почему в классе String
в Java нет обратного метода? Вместо этого метод reverse()
предоставляется в StringBuilder
? Для этого есть причина? Но String имеет split()
, regionMatches()
и т.д., Которые более сложны, чем метод reverse()
.
Когда они добавили эти методы, почему бы не добавить reverse()
?
Ответы
Ответ 1
Поскольку у вас есть это в StringBuilder, в String нет необходимости, правильно?: -)
Серьезно, при разработке API есть много вещей, которые вы могли бы включить. Однако интерфейсы намеренно сохраняются небольшими для простоты и ясности. Google в "API-дизайне", и вы найдете тонн of страницы, соглашаясь с этим.
Вот как вы это сделаете, если вам это действительно нужно:
str = new StringBuilder(str).reverse().toString();
Ответ 2
Если вам нужна историческая причина, String неизменяемы в Java, то есть вы не можете изменить данную String, если не создаете другую String.
В то время как это не так "само по себе", исходные версии пропущенных Java классов, таких как StringBuilder. Вместо этого сама строка содержала (и все еще содержит) множество методов для "изменения" String, но поскольку String неизменен, каждый из этих методов фактически создает и возвращает объект NEW String.
Это вызвало такие простые выражения, как:
String s = "a" + anotherString.substr(10,5).trim().toLowerCase();
Чтобы создать в ram что-то вроде 5 строк, 4 из которых абсолютно бесполезны, с очевидными проблемами с производительностью (несмотря на некоторые оптимизации в отношении базовых массивов char []).
Чтобы решить эту проблему, Sun представила StringBuilder и другие классы, которые НЕ являются неизменными. Эти классы свободно изменяют один массив char [], так что вызывающим методам не нужно создавать много промежуточных экземпляров String.
В последнее время они добавили "реверс", поэтому они добавили его в StringBuilder вместо String, поэтому теперь это предпочтительный способ манипулирования строками.
Ответ 3
Теоретически, String может предложить его и просто вернуть правильный результат в виде новой строки. Это просто выбор дизайна, когда вы переходите к нему, со стороны базовых библиотек Java.
Ответ 4
Ну, я думаю, это может быть потому, что это класс immutable
, поэтому, если бы у нас был обратный метод, он фактически создал бы новый объект.
Ответ 5
В качестве примечания в Scala вы используете тот же класс java.lang.String
, и вы получаете метод reverse
(наряду со всеми видами других полезных вещей). То, как это делается, заключается в неявных преобразованиях, так что ваш String
автоматически преобразуется в класс, который имеет метод reverse
. Это действительно очень умно и устраняет необходимость раздувания базового класса сотней методов.
Ответ 6
Строка неизменна, то есть ее нельзя изменить.
Когда вы меняете строку, то, что происходит, состоит в том, что каждая буква включена, она означает, что она всегда будет создавать новый объект каждый раз.
Обратимся к примеру:
Это означает, что, например, Hello становится ниже
и вы получите 4 новых объекта String в куче.
Поэтому подумайте, есть ли у вас тысячи последних строк или больше, сколько будет создано объект... это будет очень дорого. Так будет занято слишком много памяти.
Итак, из-за этого класса String не имеет метода reverse().
Ответ 7
reverse() действует на это, изменяя текущий объект, а объекты String неизменяемы - они не могут быть изменены.
Это особенно эффективно делать reverse() in situ - известно, что размер один и тот же, поэтому не требуется выделение, существует половина итераций цикла, как в копии, так и для больших строк, местность памяти оптимальна. От взгляда на код, можно видеть, что была сделана большая осторожность, чтобы сделать это быстро. Я подозреваю, что у автора (ов) был особый случай использования, который требовал высокой производительности.