Сравнение ссылки на аргументы командной строки возвращает false, в то время как массив String возвращает true

1

В настоящее время я работаю с манипуляциями с 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

Здесь у меня два запроса.

  1. если я сравню ссылку String str1 == str3, тогда он вернет false, потому что str3 создается с использованием новой строки, так что не будет находиться в пуле строк. Итак, как str1 == strArray1 [1] возвращает true??

  2. strArray [0] == strArray [1] вернет true, strArray1 [0] == strArray1 [1] также вернет true, то почему аргумент командной строки args [0] == args [1] return false??

Пожалуйста, направляйте.

  • 0
    Вы никогда не показывали нам, какие значения передаются в качестве аргументов командной строки.
  • 0
    На самом деле я запутался между массивом String, который создается с использованием аргументов new и командной строки.
Показать ещё 7 комментариев
Теги:
string
command-line-arguments
string-pool

2 ответа

4
Лучший ответ

если я сравню ссылку 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.

  • 1
    Здесь я добавлю, что строковые литералы, которые передаются любому методу, кроме main которые равны, действительно добавляются в пул String констант.
3

Не проверяйте ссылки, если все, что вы хотите сравнить, - это контент. Поэтому класс String предоставляет метод equals() в первую очередь. Первые тесты для ссылочного равенства, последние для равенства ценности.

То, как строки обрабатываются внутри, в прошлом изменилось и может измениться в будущем. Использование ссылочного равенства опирается на детали реализации, на которые вы действительно не должны полагаться.

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

Если вы действительно хотите понять, как это работает, вы должны прочитать спецификацию языка Java, доступную здесь. Что стандарт для языка и все, что явно не указано, есть деталь реализации, которая должна быть неактуальной.

  • 0
    Благодарю. но я хочу знать, как это работает и какие строки будут находиться в пуле строк.
  • 0
    @Pratik Почему? Что вы будете делать с этими знаниями? Если это просто любопытство, хорошо. Но, пожалуйста, не используйте эти знания при написании своих программ, так как, как объяснил paxdiablo, это деталь реализации, и вы не должны писать программы, основанные на деталях реализации.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню