Может кто-нибудь скажет мне, сколько объектов будет создано при выполнении инструкции 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 будут созданы.