Экземпляры строкового класса Java являются константами

#java #string

#java #строка

Вопрос:

вероятно, это простой вопрос, но не для меня на данном этапе.

Я прочитал, что (я цитирую) «Все экземпляры класса String являются константами, что означает, что они не могут быть изменены после их создания. Но строки могут быть заменены «.

Это сбивает с толку. Что означает, что строковая переменная не может быть изменена, но строка может?

Может кто-нибудь, пожалуйста, привести мне пример кода, в котором мы попытались бы изменить переменную, но потерпели неудачу?

Спасибо за помощь.

Комментарии:

1. строки неизменяемы: en.wikipedia.org/wiki/Immutable_object

2. Я думаю, что это потому, что вы не можете привести строку к любому другому типу. Его состояние остается постоянным после создания.

Ответ №1:

Когда вы пишете:

 String myString = "Hi!";
 

Вы делаете две вещи. Первый определяет ссылку с именем myString, второй создает объект String. Этот строковый объект содержит «Привет!», И нет способа это изменить. Другими словами, нет set способа изменить строку:

 myString.set("another content");
 

Однако вы можете создать новый объект и изменить свою myString ссылку, чтобы указать на него. Важно понимать, что ваша myString — это не сам объект String, а просто ссылка на него.

 myString = "New content";
 

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

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

Ответ №2:

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

 String hw = "hello world";
hw.ToUpperCase();
 

Последний не изменяет исходную строку hw , но создает новую строку со всеми символами в верхнем регистре.

Комментарии:

1. И, как указывали другие, вы можете сделать hw = «новая строка», и это сработало бы, но это было бы новое выделение памяти. Более старая ссылка на память, в которой находился «hello world», теперь считается мусором и собирается.

Ответ №3:

Что означает, что строковая переменная не может быть изменена, но строка может?

На самом деле текст, который вы процитировали, означает прямо противоположное этому.

Строковая переменная может быть назначена (т.е. заменена). Примером является:

 String s = "first";
s = "second";
 

Это заменяет ссылку на «первый» ссылкой на «второй».

Я не могу привести вам законный пример изменения содержимого / состояния строки, потому что вы не можете этого сделать *.

* На самом деле, вы можете сделать это, нарушив инкапсуляцию строкового объекта с помощью отражения. Но это действительно, действительно плохая идея.

Ответ №4:

Ответ на вопрос таков: в Java строковый литерал является неизменяемым объектом.

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