2014-02-12 4 views
11

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

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

Это зависит от реализации - возможно, 5 на горячей точке ... Почему это имеет значение? – assylias

+1

Я вижу только 1 объект String, созданный здесь. См. Мой ответ. Если кто-то думает о чем-то другом, просьба дать объяснение, а не говорить случайные числа. – Maroun

+0

эти вопросы неясно, следует ли учитывать время создания объектов, созданных компиляцией, или нет; все предоставленные ответы в данный момент оставляют их. Во время компиляции есть 4 распределения, 2 наследуются от Object (обе строки) – tiagoboldt

ответ

1

Только 1 объект Строки получить сцепляются.

1

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

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

Там будет 2 объекта.

+1

Это больше, чем одна строка ... – assylias

+0

Я вижу как минимум два здесь! –

+1

Итак ** во время ** конкатенации это будет фактически ** два ** объекта, не так ли?'StringBuilder' и' String' –

1

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

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

5

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

+0

2 правильный ответ. –

1

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

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); 

Это зависит от того, рассчитывать ли вы «я ценю это» и «J значение» строки, которые создаются один раз и затем повторно используется.

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

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

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

+2

Вы уверены в 'temp.append (String.valueOf (i))'? Поскольку существует вариант «append», принимающий аргумент 'int', я бы предположил, что это используется. – Henry

+1

@ Ɍ.Ɉ Это не является окончательным. Символы строкового представления могут быть определены и добавлены индивидуально, не создавая 'String'. Просто общий эффект тот же. – Henry

+0

Просто протестировал его, он вызывает 'temp.append (i)'. Отредактированный ответ. – immibis

0

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

  1. INT I
  2. Int J
  3. "я значение"
  4. "я значение" + I
  5. "я значение" + I + «J значение «
  6. » я ценю это «+ я +» J значение «+ J

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

+1

'int' - примитивный тип, а не объект. С другой стороны, Integer. – xlm

+0

@xlm, так что это зависит от того, если при конкатенации примитив когда-либо преобразуется в Integer. Я сомневаюсь, что так будет. – Cruncher

2

Код

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, конкатенированную.

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

+0

Я бы сказал, что '(« i value is »). Concat (i)' делает 2 объекта. Сначала нужно сделать «i value is». Затем он должен 'concat' i к нему возвращать новую строку. – Cruncher

+0

Это 'obj1 =" i value is "; obj2 = obj1.concat (i); obj3 =" j value is "; obj4 = obj2.concat (obj3); obj5 = obj4.concat (j);' – Cruncher

+0

'" i значение «' уже будет существовать до начала выполнения. – cHao

6

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

Я завернул ваш код в основную функцию, скомпилировал его, а затем разобрал его с 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.

0

5 объектов

  1. "я значение" объект .A Строка будет сформирован.
  2. «i value is» + i. Эта операция конкатенации образует 2-й объект.
  3. «j value is» будет образовывать третий объект.
  4. "i value is" + i + "j value is" .4-й объект, образованный из-за конкатенации.
  5. "i value is" + i + "j value is" + j. Это последняя конкатенация будет составлять 5-й объект.
Смежные вопросы