Является ли var str: String изменчивым или неизменяемым?

Я объявила переменную String в Kotlin как.

var str: String

Документ Котлина противоречит концепции мутируемости. Согласно документу... var является изменяемым. var is mutable

Но для String он определяется как неизменный. String is immutable

Итак, пожалуйста, проясните противоречие...

Ответ 1

Собственно, String variable является изменяемым, но String Value является неизменяемым.

Оцените с помощью @cricket_007

Позвольте мне подробно описать, что произошло после объявления переменной.

val string1 = "abcd"  
val string2 = "abcd"

введите описание изображения здесь

Как показано выше изображение и Декларация.

-String пул - специальная область хранения в Память кучи.

-Когда a string is created и если строка already exists в пуле, ссылка existing string will be returned вместо создания нового объекта и возврата его ссылки.

-Если строка не является неизменной, изменение строки с помощью одной ссылки приведет к неправильному значению для других ссылок.

-Например выше наш пример Value Assign to Variable String1 теперь мы можем использовать эту переменную.

также можно изменить значение

string1.renameTo("Hi This Is Test")

Итак, что происходит позади в памяти?
- > да,
, если "Привет, это тест", эта строка будет доступна для ссылки " строка1"
else. Создайте новое пространство и дайте ссылку " строка1"

Собственно, что Why String называется immutable.

Ссылка - Ссылка

Ответ 2

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

Переменная, объявленная ключевым словом var, переопределяется, тогда как объявлено с ключевым словом val.

Строка является неизменным типом объекта, после ее создания ее нельзя изменить.

Является ли переменная переопределяемой и является ли объект, на который он указывает, является неизменной, это две разные вещи.

Вот пример:

class Person(var name: String)

val fred = Person("Fred")

fred.name = "Barry" // fred is not immutable

fred = Person("Barry") // ERROR Val cannot be reassigned

Итак, чтобы использовать mutable в способе, описанном в документации, только потому, что объявлен символ, val не делает объект, который он указывает на неизменяемый.

Ответ 3

отличный пример от @Frank. Это делает меня более ясным, что говорится в документации.

В первой части документации говорится:

Классы в Котлине могут иметь свойства. Они могут быть объявлены как mutable, используя ключевое слово var или только для чтения, используя ключевое слово val.

Теперь вторая часть говорит:

Строки представлены типом String. Строки неизменяемы.

Эти оба истины, на мой взгляд.

Основываясь на примере Фрэнка, давайте возьмем еще один пример.

data class User(var name: String, var email:String)

var user1 = User("Foo","[email protected]")  
// user1 is mutable and object properties as well

val user2 = User("Bar","[email protected]")
// user2 is immutable but object properties are mutable

Теперь рассмотрим свойство user1. Он изменен, поскольку он объявлен с ключевым словом var. А также объект User присваивает ему.

Но свойство user2 является неизменным. Вы не можете изменить назначенный ему объект. Но сам объект имеет изменяемые свойства. Таким образом, свойства могут быть изменены на user2.name = "Foo".

Теперь немного изменим пример и сделаем пользовательские свойства неизменяемыми.

data class User(val name: String, val email:String)

var user1 = User("Foo","[email protected]")  
// user1 is mutable and object properties are not

val user2 = User("Bar","[email protected]")
// user2 is immutable and object properties are also immutable

Здесь свойства пользователя неизменяемы. Таким образом, user1 является изменяемым, вы можете назначить ему другой объект. Но свойства неизменяемы. Так что user1 = User("New Foo","[email protected]") будет работать. Но после назначения объекта User вы не можете изменить его свойства, поскольку они неизменяемы.

Теперь возьмем пример со строковым типом.

var str1 = "Bar"
// Here str1 (property) is mutable. So you can assign a different string to it. 
// But you can not modify the String object directly.
str1 = "Foo"  // This will work
str1[0] = 'B' // This will NOT work as The string object assigned to str1 is immutable

val str2 = "Foo"
// Here both str2 and the assigned object are immutable. (Just like Java final)

И как сказал Фрэнк,

только потому, что символ объявлен, val не делает объект, который он указывает на неизменяемый.

Мои последние центы:

Объект String неизменен, поскольку его нельзя изменить. Но затем неизменяемый объект String может быть привязан к изменяемому свойству , которое может быть переназначена с помощью другого объекта String. Что это var ключевое слово делает. Изменение свойства. Но объект это точки могут быть изменчивыми или неизменными.

Ответ 4

Какое противоречие? Строка доступна только для чтения. Так же, как Java, вы не можете установить a[i] = 'x', любые методы замены строк возвращают новые строки и т.д. Поэтому не изменяются. Это делается для уточнения функциональности типа var String

Разница между var и val может быть связана с переменной final в Java. Вы можете создать константу final String, или вы можете иметь обычный объект String

Ответ 5

В Kotlin/Java поведение объекта не зависит от типа ссылки, которую вы используете для доступа к ней. Все (потенциально) в куче, поэтому любое свойство является ссылкой (ссылка a.k.a.) на объект.

val str = "Hello"
val a = str
var b = str

В вышеприведенном фрагменте есть только одна неизменяемая строка str, и оба a и b ссылаются на нее. Вы не можете изменить строку, независимо от того, какую ссылку вы используете, изменяете или неизменяете. Но вы можете изменить изменчивую ссылку, чтобы указать на другую (неизменяемую) строку:

b = "World"

Ответ 6

Лично мне легче думать о различии между val и var в терминах Java. val будет соответствовать переменной с модификатором final, что означает, что ее можно назначить только один раз, а var - только с отсутствием этого модификатора и, следовательно, переназначением.

Сам объект может быть либо изменчивым, либо неизменным. Mutability здесь относится к самой переменной.