Семантика объекта String
такова, что если два экземпляра всегда содержат одинаковую последовательность символов, они всегда будут содержать одинаковую последовательность символов, а один может - по крайней мере с точки зрения String
сам объект - заменить все ссылки на одну из строк ссылками на другую без изменения семантики программы. Такие экземпляры могут считаться эквивалентными, поскольку для всех практических целей единственная информация, инкапсулированная в экземпляре String
, - это последовательность символов, содержащаяся в целевом экземпляре.
Напротив, переменная типа StringBuffer
инкапсулирует не только последовательность символов, но и идентификатор * конкретного экземпляра. Если две переменные ссылаются на один и тот же экземпляр, изменение экземпляра, на который ссылается одна переменная, повлияет на экземпляр, на который ссылается другая (поскольку это один и тот же экземпляр). Если они ссылаются на разные экземпляры, изменения в экземпляре, на который ссылается один, не влияют на экземпляр, на который ссылается другой. Решение не использовать Java StringBuffer
override equals
не было результатом лени, а скорее основывалось на факте, что StringBuffer
объекты имеют значимую идентичность, а непересекающиеся экземпляры всегда имеют разные идентичности.