Может кто-нибудь скажет мне, сколько объектов будет создано при выполнении инструкции System.out.println
в приведенном ниже коде
int i=0;
int j=1;
System.out.print("i value is "+ i + "j value is "+j);
Может кто-нибудь скажет мне, сколько объектов будет создано при выполнении инструкции System.out.println
в приведенном ниже коде
int i=0;
int j=1;
System.out.print("i value is "+ i + "j value is "+j);
Если вы действительно хотите знать, что происходит, почему бы не посмотреть на байт-код?
Я завернул ваш код в основную функцию, скомпилировал его и затем разобрал с помощью 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
.
Это создаст объект StringBuilder
(и независимо от того, что этот объект использует внутренне), добавьте значения и, наконец, StringBuilder
создаст объект String
с результатом.
Код
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, конкатенированную.
Это то, что я считаю своим ограниченным знанием. Исправьте меня, если я ошибаюсь.
Только 1
объект String будет конкатенирован.
Если это действительно зависит от реализации, тогда, если он оценивается как:
StringBuilder sb = new StringBuilder("i value is ");
sb.append(i);
sb.append(j);
String newStr = sb.toString();
Будет создано 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);
Это зависит от того, считаете ли вы значения "i value is" и "j value", которые создаются один раз, а затем повторно используются.
Если вы их подсчитаете, то по крайней мере 4, иначе как минимум 2.
Собственно, каждая строка имеет свой собственный char [], который фактически сохраняет строку. Так что 7 или 3 вместо 4 или 2.
У StringBuilder есть char [], и, возможно, вам придется создать новый char [], поскольку вы добавите к нему больше данных. String.valueOf или System.out.print также могут создавать объекты за вашей спиной, и вы не сможете узнать о них без внешних инструментов. Следовательно, "по крайней мере".
Строка неизменной означает, что вы не можете изменить сам объект.
Выполняя конкатенацию каждый раз, когда создаются новые строковые объекты.
Итак, в приведенном выше примере
В приведенном выше примере создаются шесть объектов.
5 объектов
Вы должны рассмотреть 2 пункта здесь:
В этом случае приведенный выше ответ является правильным. Пять объектов String будут созданы.