Нет обратного метода в классе String в Java? - PullRequest
16 голосов
/ 14 сентября 2011

Почему в Java String нет обратного метода?Вместо этого метод reverse() предоставляется в StringBuilder?Для этого есть причина?Но String имеет split(), regionMatches() и т. Д., Которые являются более сложными, чем метод reverse().

Когда они добавляют эти методы, почему бы не добавить reverse()?

Ответы [ 7 ]

28 голосов
/ 14 сентября 2011

Поскольку он у вас есть в StringBuilder, он не нужен в String, верно?: -)

Серьезно, при разработке API есть много вещей, которые вы можете включить.Интерфейсы, тем не менее, намеренно сохраняются небольшими для простоты и ясности.В Google "API design" вы найдете тонны из страниц , согласных на это.нужно это:

str = new StringBuilder(str).reverse().toString();
3 голосов
/ 14 сентября 2011

Если вам нужна историческая причина, String неизменны в Java, то есть вы не можете изменить данную строку, если не создаете другую строку.

Хотя это и неплохо "per se", в начальных версиях Java отсутствовали такие классы, как StringBuilder. Вместо этого сама String содержала (и все еще содержит) множество методов для «изменения» String, но поскольку String является неизменяемым, каждый из этих методов фактически создает и возвращает объект NEW String.

Это вызвало простые выражения, такие как:

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

На самом деле создать в оперативной памяти что-то вроде 5 строк, 4 из которых абсолютно бесполезны, с очевидными проблемами с производительностью (несмотря на то, что была проведена некоторая оптимизация относительно базовых массивов char []).

Чтобы решить эту проблему, Sun представила StringBuilder и другие классы, которые НЕ являются неизменяемыми. Эти классы свободно модифицируют один массив char [], поэтому при вызове методов не требуется создавать много промежуточных экземпляров String.

Они добавили «реверс» в последнее время, поэтому они добавили его в StringBuilder вместо String, потому что теперь это предпочтительный способ манипулирования строками.

1 голос
/ 14 сентября 2011

Теоретически, String может предложить его и просто вернуть правильный результат в виде новой String.Когда дело доходит до этого, это просто выбор дизайна со стороны базовых библиотек Java.

0 голосов
/ 26 июня 2016

Строка является неизменной, то есть ее нельзя изменить.

Когда вы переворачиваете строку, происходит то, что каждая буква включается самостоятельно, это означает, что она будет каждый раз создавать новый объект.

Давайте посмотрим на примере: Это означает, что, например, Hello становится как показано ниже

  • ELLOH LLOEH LOLH OLEHH

и вы получите 4 новых объекта String в куче. Так что подумайте, если у вас есть тысячи строк или больше, то сколько объектов будет создано ... это будет действительно очень дорого. Слишком много памяти будет занято.

Так что из-за того, что у этого класса String нет метода reverse ().

0 голосов
/ 14 сентября 2011

Как примечание: в Scala вы используете тот же класс java.lang.String и получаете метод reverse (наряду со всеми другими полезными вещами).То же самое происходит с неявными преобразованиями , поэтому ваш String автоматически преобразуется в класс, который имеет метод reverse.Это действительно довольно умно и избавляет от необходимости раздувать базовый класс сотнями методов.

0 голосов
/ 14 сентября 2011

Ну, я думаю, это может быть потому, что это класс immutable, поэтому, если бы у нас был обратный метод, он фактически создал бы новый объект.

0 голосов
/ 14 сентября 2011

reverse () действует на this , изменяя текущий объект, а объекты String неизменяемы - их нельзя изменить.

Особенно эффективно делать reverse () in situ - размер, как известно, одинаков, поэтому выделение не требуется, итераций цикла вдвое меньше, чем в копии, и для больших строк локальность памяти является оптимальной. Посмотрев на код, можно увидеть, что для его ускорения были предприняты большие усилия. Я подозреваю, что автор (ы) имел в виду конкретный вариант использования, который требовал высокой производительности.

...