Подтвердить что ты не робот

Количество объектов, созданных при конкатенации строк

Может кто-нибудь скажет мне, сколько объектов будет создано при выполнении инструкции System.out.println в приведенном ниже коде

int i=0;
int j=1;
System.out.print("i value is "+ i + "j value is "+j);
4b9b3361

Ответ 1

Если вы действительно хотите знать, что происходит, почему бы не посмотреть на байт-код?

Я завернул ваш код в основную функцию, скомпилировал его и затем разобрал с помощью javap -c Test.class. Здесь вывод (с использованием компилятора Oracle Java 7):

Compiled from "Test.java"
class Test {
  Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public static void main(java.lang.String[]);
    Code:
       0: iconst_0
       1: istore_1
       2: iconst_1
       3: istore_2
       4: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       7: new           #3                  // class java/lang/StringBuilder
      10: dup
      11: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
      14: ldc           #5                  // String i value is
      16: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      19: iload_1
      20: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      23: ldc           #8                  // String j value is
      25: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      28: iload_2
      29: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
      32: invokevirtual #9                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      35: invokevirtual #10                 // Method java/io/PrintStream.print:(Ljava/lang/String;)V
      38: return
}

Единственным объектом, который выделяется в этом методе, является StringBuilder (по команде new в позиции 7). Тем не менее, другие методы, которые invoke d могли бы выделить что-то сами, и у меня есть очень сильное подозрение, что StringBuilder.toString будет выделять объект String.

Ответ 2

Это создаст объект StringBuilder (и независимо от того, что этот объект использует внутренне), добавьте значения и, наконец, StringBuilder создаст объект String с результатом.

Ответ 3

Код

int i=0;
int j=1;
System.out.print("i value is "+ i + "j value is "+j);

Создает 3 объекта.

Мой разум:

Основные типы данных в Java не являются объектами и не наследуются от Object. так   int i=0; and int j=1; не создает объект.

Теперь System.out.print("i value is "+ i + "j value is "+j);, который содержит String, которые являются неизменяемыми, а операции с строкой являются дорогостоящими. Мы можем разделить операции как это.

("i value is ").concat(i)  // creates one object let say obj1
obj1.concat("j value is ")   //creates another let say obj2
obj2.concat(j)            // creates the final string let say obj3;

В примерной строке операция str1.concat(str2) выполняется с использованием двух объектов String, и она создает третью и меняет ссылку, создавая иллюзию, что ее фактически является первым строковым объектом, т.е. str1. Таким образом, str1 будет иметь новую String, которая содержит значение старой str1 и str2, конкатенированную.

Это то, что я считаю своим ограниченным знанием. Исправьте меня, если я ошибаюсь.

Ответ 4

Только 1 объект String будет конкатенирован.

Ответ 5

Если это действительно зависит от реализации, тогда, если он оценивается как:

StringBuilder sb = new StringBuilder("i value is ");
sb.append(i);
sb.append(j);
String newStr = sb.toString();

Будет создано 2 объекта.

Ответ 6

Только 1 для печати строки.

Правило большого пальца. Всякий раз, когда выполняется конкатенация строк, создается новый объект.

Ответ 7

Код преобразуется компилятором в нечто вроде этого:

int i=0;
int j=1;
StringBuilder temp = new StringBuilder(); // creates a StringBuilder
temp.append("i value is "); // creates or re-uses a String
temp.append(i); // might create a String
temp.append("j value is"); // creates or re-uses a String
temp.append(j); // might create a String
String temp2 = temp.toString(); // creates a String
System.out.print(temp2);

Это зависит от того, считаете ли вы значения "i value is" и "j value", которые создаются один раз, а затем повторно используются.

Если вы их подсчитаете, то по крайней мере 4, иначе как минимум 2.

Собственно, каждая строка имеет свой собственный char [], который фактически сохраняет строку. Так что 7 или 3 вместо 4 или 2.

У StringBuilder есть char [], и, возможно, вам придется создать новый char [], поскольку вы добавите к нему больше данных. String.valueOf или System.out.print также могут создавать объекты за вашей спиной, и вы не сможете узнать о них без внешних инструментов. Следовательно, "по крайней мере".

Ответ 8

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

  • int i
  • int j
  • "i значение"
  • "i значение равно" + i
  • "i значение" + я + "j значение"
  • "i значение равно" + я + "j значение равно" + j

В приведенном выше примере создаются шесть объектов.

Ответ 9

5 объектов

  • "i value is". Будет сформирован объект String.
  • "i значение" + i. Эта операция конкатенации будет формировать 2-й объект.
  • "j value is" будет создавать третий объект.
  • "i value is" + я + "j значение - это".4-й объект, сформированный из-за конкатенации.
  • "i значение равно" + я + "j значение" + j. Последняя конкатенация будет составлять 5-й объект.

Ответ 10

Вы должны рассмотреть 2 пункта здесь:

  1. Когда вы говорите, что String является неизменным, он создаст новый объект, если вы попытаетесь изменить значение.
  2. Строковый объект будет создан, когда вы пишете код, используя Literal (String s = "Pool") или используя новое ключевое слово (String s = new String ("Heap и Pool"), здесь новое ключевое слово ссылается на кучу, Literal "Heap и Pool" "ссылается на пул констант строки).

В этом случае приведенный выше ответ является правильным. Пять объектов String будут созданы.