Потому что существуют неизменяемые и изменяемые классы.
String
, как указывает другой ответ, является неизменным классом. Их значение всегда остается неизменным после создания строки.
Если у вас есть объект ArrayList<Integer>
, вы можете использовать его функцию add
, чтобы добавить еще одно целое число в список. Функция add
изменяет список на месте, а не возвращает новый список. ArrayList является изменяемым.
Ответ на редактирование :
Для вашего отличного примера, вероятно, его дизайнеры сели и заметили, что чаще всего требуется новый список, содержащий обратный результат, и оставить старый список без изменений. (Почему? Я не знаю). С другой стороны, они могли заметить, что есть еще случаи, когда вы не хотите иметь новый список, который содержит отсортированный результат. Так что он делает свою работу на месте. Но я не знаю и раньше не пользовался Groovy, поэтому просто предположение.
В Ruby я слышал, что для этого есть понятие: функции, которые изменяют объекты на месте, после них пишут восклицательный знак, а функции, которые возвращают результат как новый объект, не имеют восклицательного знака:
newObj = obj.sort(); // new sorted list is returned
obj.sort!(); // obj is sorted in-place