В настоящее время я работаю с манипуляциями с String, и, делая демоверсию, я нашел другое поведение.
Ниже мой код.
public class HelloWorld{
public static void main(String []args){
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
String strArray[] = {"Hello","Hello"};
String strArray1[] = new String[] {"Hello","Hello"};
System.out.println("str1==str2:: "+(str1==str2));
System.out.println("str1==str3:: "+(str1==str3));
System.out.println("strArray[0]==strArray[1]:: "+(strArray[0]==strArray[1]));
System.out.println("str1==strArray[1]:: "+(str1==strArray[1]));
System.out.println("strArray1[0]==strArray1[1]:: "+(strArray1[0]==strArray1[1]));
System.out.println("str1==strArray1[1]:: "+(str1==strArray1[1]));
System.out.println("args[0]==args[1]:: "+(args[0]==args[1]));
}
}
И выведенный выше код. Я использую аргументы командной строки для передачи кода.
java HelloWorld Hello Hello
str1 == str2 :: true
str1 == str3 :: false
strArray [0] == strArray [1] :: true
str1 == strArray [1] :: true
strArray1 [0] == strArray1 [1] :: true
str1 == strArray1 [1] :: true
args [0] == args [1] :: false
Здесь у меня два запроса.
если я сравню ссылку String str1 == str3, тогда он вернет false, потому что str3 создается с использованием новой строки, так что не будет находиться в пуле строк. Итак, как str1 == strArray1 [1] возвращает true??
strArray [0] == strArray [1] вернет true, strArray1 [0] == strArray1 [1] также вернет true, то почему аргумент командной строки args [0] == args [1] return false??
Пожалуйста, направляйте.
если я сравню ссылку String str1 == str3, тогда он вернет false, потому что str3 создается с использованием новой строки, так что не будет находиться в пуле строк. Итак, как str1 == strArray1 [1] возвращает true??
String strArray1[] = new String[] {"Hello","Hello"};
создает новый массив String со ссылкой на ту же строку "hello"
внутри массива *.
strArray [0] == strArray [1] вернет true, strArray1 [0] == strArray1 [1] также вернет true, то почему аргумент командной строки args [0] == args [1] возвращает false?
args[0]==args[1]
возвращает false
, поскольку они представляют собой два разных экземпляра (не добавлены в пул строк), они похожи на new String()
. Вы можете легко протестировать это, используя:
System.out.println(System.identityHashCode(args[0]));
System.out.println(System.identityHashCode(args[1]));
Итак, аргументы, переданные main()
, НЕ добавляются в пул констант String.
main
которые равны, действительно добавляются в пул String констант.
Не проверяйте ссылки, если все, что вы хотите сравнить, - это контент. Поэтому класс String
предоставляет метод equals()
в первую очередь. Первые тесты для ссылочного равенства, последние для равенства ценности.
То, как строки обрабатываются внутри, в прошлом изменилось и может измениться в будущем. Использование ссылочного равенства опирается на детали реализации, на которые вы действительно не должны полагаться.
Вся суть инкапсуляции заключается в том, чтобы позволить вещам изменять под обложками, не затрагивая клиентский код. Вы должны следовать "правилам", чтобы вас не укусили.
Если вы действительно хотите понять, как это работает, вы должны прочитать спецификацию языка Java, доступную здесь. Что стандарт для языка и все, что явно не указано, есть деталь реализации, которая должна быть неактуальной.