Где новый объект String создается, когда мы конкатируем, используя оператор + - PullRequest
0 голосов
/ 01 июня 2018

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

В следующем коде:

String str1 = "Hello";
String str2 = "World";
String str3 = new String("HelloWorld");
String str4 = str1 + str2;

Я знаю, что str1 и str2 создадут объект "Hello" и "World" соответственно внутри Пул констант * String .В то время как для str3 создается новый объект вне пул строковых констант , который указывает на «HelloWorld», который создается внутри пул строковых констант .

Мой вопрос: что произойдет, если я конкатюрую 2 или более строки (, используя метод '+' или concat () )?

Будет ли новый объектбыть создан вне пула, как в случае String str3 или будет str4 указывать непосредственно на объект "HelloWorld" внутри String Constant Pool

PS: а IF это случай, аналогичный созданию нового объекта вне пула, тогда какэто происходит без использования ключевого слова new ?

Ответы [ 4 ]

0 голосов
/ 05 августа 2018

Чтобы ответить на ваш вопрос, объект str4 создается вне пула.

Это мое объяснение:

    String s = "abc";
    String s1="xyz";

    String s3 = "abcxyz";
    String s2=s+s1;

    if(s2 == s3){
        System.out.println("true");
    }else{
        System.out.println("false");
    }

Это напечатает false.Это означает, что s2 не ссылается на объект пула, созданный s3.

0 голосов
/ 01 июня 2018

Прежде всего, это не ответ, это способ получить ответ самостоятельно или объяснить ситуацию.
Слияние двух строк всегда создает новый объект строки.
Чтобы соответствовать этому, вы можете сделать одну вещь: как это было в куче и пуле памяти.

1: перейти к NetBeans:
2: написать программу так:

public class StringTest {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "World";
        String str3 = new String("HelloWorld");
        String str4 = str1 + str2;
        String str5 = str1 + str2;
        String str6 = str1.concat(str2);

        String str7 = "HelloWorld";
        String str8 = "HelloWorld";

        System.out.println("");
    }
}

3: Просто поставьте точку останова на System.out.println(""); этой строке.
4: Теперь отладьте этот код.
5: Перейдите в окно переменных (Window-> Debugging-> Variables), которое выглядитнапример:

enter image description here

6: щелкните правой кнопкой мыши на str8 и выберите Отметить объект ... и присвойте некоторый тегэтот объект, такой как Same Object.

Теперь вы можете видеть, что та же строка тега также появляется на str7 как:

enter image description here

Который показывает, что обе ссылки str7' and str8` являются ссылками на один и тот же объект.

7: Теперь проверьте эту вещь на str3-4-5-6 все ссылки, пометив их другой меткойНапример:

enter image description here

И для дальнейшего более внутреннего управления этим объектом просто посмотрите на параметр Show Refereances, щелкнув правой кнопкой мыши имя переменной в окнах переменныхнапример:

enter image description here enter image description here

Обновление:
- Объединение создает объекты в куче.
- Чтобы убедиться, что этот оператор выглядит , который говорит, что пул не может содержать несколько строк с одинаковым значением
- И здесь str7-8 - это упомянутый объект из пула, который отличается отstr4-5-6, как показано на скриншоте пункта 7.
- И вы также можете подтвердить это, сравнив str5 с str7, используя оператор ==, если он возвращает true, конкатенация создает объекты в пулепотому что str7 ссылаются на пул и оба ссылаются на один и тот же объект, но он вернет false, потому что оба не совпадают.

0 голосов
/ 01 июня 2018
        **str4 is stored in heap.**        
                String str1 = "Hello";
                String str2 = "World";
                String str3 = new String("HelloWorld");
                String str4 = str1 + str2;
                String str5="HelloWorld";
            if str4 is stored on string pool then str5 will point to same object where str4 is pointing.
            but this statement giving me false output-:
                **System.out.println(str4 == str5);**
            ***************output****************
            false

                 String str4 = (str1 + str2).intern();
                 String str5="HelloWorld";
                but if you are using  String.intern then this method will try to find a String with the same sequence of characters in the pool.
    **System.out.println(str4 == str5);**
    ***************output******************
    true


  [1]: https://i.stack.imgur.com/IjMhP.png
0 голосов
/ 01 июня 2018

Прежде всего String s = new String("abs"); Будет создано два объекта, один объект в области пула, а другой в области без пула, потому что вы используете в качестве параметра как новый, так и строковый литерал.

String str1 = "Hello";
String str2 = "World";
String str3 = new String("HelloWorld");
String str4 = str1 + str2;

До сих пор у вас есть пять String объектов, четыре в String Constant Pool и один в Heap.Таким образом, ваш str4 - это новый объект внутри пула строк. Проверьте также следующий код:

 String str5="HelloWorld"; //This line will create one more String Constant Pool object because we are using variable name as str5.
 String str6="HelloWorld";////This line will not create any object, this will refer the same object str5.

Для теста

System.out.println(str3==str4); //false
System.out.println(str4==str5);//false
System.out.println(str5==str6);//true
...