Может кто-то пожалуйста, скажите мне, сколько объектов будет создана на выполнение 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);
Только 1
объект Строки получить сцепляются.
Если это действительно зависит от реализации, а затем, если она оценивается в:
StringBuilder sb = new StringBuilder("i value is ");
sb.append(i);
sb.append(j);
String newStr = sb.toString();
Там будет 2 объекта.
Это больше, чем одна строка ... – assylias
Я вижу как минимум два здесь! –
Итак ** во время ** конкатенации это будет фактически ** два ** объекта, не так ли?'StringBuilder' и' String' –
Только 1 для печати строки.
Правило большого пальца - Когда конкатенация строк завершена, создается новый объект.
Это создаст объект StringBuilder
(и независимо от того, что этот объект использует внутренне), добавьте значения и, наконец, StringBuilder
создаст объект String
с результатом.
2 правильный ответ. –
код преобразуется, компилятором, к чему-то вроде этого:
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 также могут создавать объекты за вашей спиной , и вы не можете узнать о них без внешних инструментов. Отсюда «по крайней мере».
Вы уверены в 'temp.append (String.valueOf (i))'? Поскольку существует вариант «append», принимающий аргумент 'int', я бы предположил, что это используется. – Henry
@ Ɍ.Ɉ Это не является окончательным. Символы строкового представления могут быть определены и добавлены индивидуально, не создавая 'String'. Просто общий эффект тот же. – Henry
Просто протестировал его, он вызывает 'temp.append (i)'. Отредактированный ответ. – immibis
Строка непреложная означает, что вы не можете изменить сам объект.
При выполнении конкатенации каждый раз, когда создаются новые строковые объекты.
Таким образом, в приведенном выше примере
Всего шесть объектов создают d в приведенном выше примере.
Код
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, конкатенированную.
Это то, во что я верю своим ограниченным знанием. Исправьте меня, если я ошибаюсь.
Я бы сказал, что '(« i value is »). Concat (i)' делает 2 объекта. Сначала нужно сделать «i value is». Затем он должен 'concat' i к нему возвращать новую строку. – Cruncher
Это 'obj1 =" i value is "; obj2 = obj1.concat (i); obj3 =" j value is "; obj4 = obj2.concat (obj3); obj5 = obj4.concat (j);' – Cruncher
'" i значение «' уже будет существовать до начала выполнения. – cHao
Если вы действительно хотите знать, что происходит, почему бы не посмотреть на байт-код?
Я завернул ваш код в основную функцию, скомпилировал его, а затем разобрал его с 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
.
5 объектов
Это зависит от реализации - возможно, 5 на горячей точке ... Почему это имеет значение? – assylias
Я вижу только 1 объект String, созданный здесь. См. Мой ответ. Если кто-то думает о чем-то другом, просьба дать объяснение, а не говорить случайные числа. – Maroun
эти вопросы неясно, следует ли учитывать время создания объектов, созданных компиляцией, или нет; все предоставленные ответы в данный момент оставляют их. Во время компиляции есть 4 распределения, 2 наследуются от Object (обе строки) – tiagoboldt