В общем, вам следует использовать строковую литеральную нотацию, когда это возможно. Ее легче читать, и это дает компилятору возможность оптимизировать ваш код.
Ответ 2
Строковый литерал - это концепция языка Java. Это строковый литерал:
"a String literal"
Строковый объект является отдельным экземпляром java.lang.String класса.
Все допустимы, но имеют небольшое различие. s1 будет ссылаться на интернированный строковый объект. Это означает, что последовательность символов "abcde" будет храниться в центральном месте, и всякий раз, когда тот же литерал "abcde" используется снова, JVM не будет создавать новый строковый объект, а будет использовать ссылку на кэшированную строку.
s2 гарантируется, что это будет новый строковый объект, поэтому в данном случае мы имеем:
s1 == s2 // is false s1 == s3 // is true s1.equals(s2) // is true
Ответ 3
Длинный ответ доступен здесь, поэтому я дам вам короткий.
Когда вы делаете это:
Stringstr="abc";
Вы вызываете intern() метод для строки. Этот метод ссылается на внутренний пулString объектов. Если строка, для которой вы вызвали intern(), уже находится в пуле, то ссылка на нее String присваивается str. Если нет, то новый объект String помещается в пул, и затем ему присваивается ссылка на str.
Когда вы проверяете идентичность объекта, выполняя == (вы буквально спрашиваете: указывают ли эти две ссылки на один и тот же объект?), вы получаете true.
Однако вам это не нужноintern()Strings. Вы можете принудительно создать новый Object объект в куче, выполнив следующее:
В данном случае str и str2 являются ссылками на разные Objects, ни одна из которых не была интернирована, так что при проверке на Object идентичность с помощью ==, вы получите false.
С точки зрения надлежащей практики кодирования: не используйте == для проверки равенства строк, используйте .equals() вместо этого.
Ответ 4
Поскольку строки неизменяемы, когда вы делаете:
Stringa="xyz"
при создании строки JVM выполняет поиск в пуле строк, существует ли уже строковое значение, "xyz" если да, то 'a' это будет просто ссылка на эту строку, и новый строковый объект не создается.
Но если вы скажете:
Stringa=newString("xyz")
вы заставляете JVM создавать новую String ссылку, даже если "xyz" она находится в ее пуле.
Для получения дополнительной информации прочтите это.