Сколько объектов создано в 4 ситуациях, упомянутых ниже?
int[] array = new int[10];
String[] str = new String[10];
Edit 1 :
String[] str = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
Edit 2 :
String[] str1 = new String[10];
for(int i = 0;i<10;i++){
str1[i] = "Str";
}
Массивы Java - это один объект. И выделение нового массива может только выделить один объект. Выделение может быть вложен, либо путем записи нового в блок инициализации массива, либо автоматический бокс, либо конструктором объектов, который также вызывает новое в виде цепного действия.
Ответы на ваши три случая: 1, 1 и 1. Подробности ниже, а также некоторые другие примеры, чтобы выделить особые случаи.
Строки и autoboxed ints также могут быть особыми случаями, поскольку JVM имеет специальные кеши для них. Подробности в следующих комментариях:
// 1 object, an array with 10 elements (set to zero)
int[] array = new int[10];
// 1 objects, an array with 10 elements (set to null)
String[] str = new String[10];
// 1 object, an array with 10 elements pointing at objects
// that have been preallocated within the String pool. See
// the appendium below for evidence.
String[] str = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
// 3 objects, one for the array and one per integer.
Integer[] a4 = new Integer[] { new Integer(1), new Integer(2) };
// 1 object again, Java has an Integer pool of limited size which is used
// to optimise auto boxing; 1 and 2 will definitely be within that default
// range
Integer[] a6 = new Integer[] { 1, 2 };
// 3 objects, the default size of the int pool is fairly low
// but it can be increased via a JVM flag.
Integer[] a5 = new Integer[] { 1000, 2000 };
// 3-5 objects -- 1 for the array, one for each of the string objects and 1
// per char array backing the string. Depending on JVM version the char
// array may be shared with the interned strings, so that one is a little tricky
// and is why I said 3-5.
String[] str = {new String("1"), new String("2")};
Appendium
Просто для удовольствия, вот доказательство постоянного пула в действии.
Следующий код Java компилируется до следующих байтовых кодов, обратите внимание, что выделяется только массив. Элементы используют константы пула классов. Я сократил выходной результат, он просто повторяет один и тот же код для каждого элемента (dup, iconst, ldc, aastore,...)
Код java:
String[] str = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" };
JVM-байтовый код:
0: bipush 10
2: anewarray #2 // class java/lang/String
5: dup
6: iconst_0
7: ldc #3 // load constant from class pool - String 1
9: aastore // store into array
10: dup
11: iconst_1
12: ldc #4 // String 2
14: aastore
15: dup
16: iconst_2
Array
объекты Array
.
int[] array = new int[10];// can hold 10 ints
String[] str = new String[10]; // can hold references to 10 Strings
Как говорили другие, ваши первые два оператора создают по одному объекту каждый (массив).
Третий немного особенный. Вы создаете String-массив (1 объект), заполненный ссылками на 10 строк (10 объектов). Итак, это 11 объектов.
Не совсем. Строковые литералы в Java объединены, что означает, в основном, что там особое место в памяти, где хранятся все литералы String. Итак, если вы используете строку "string"
в двух разных местах вашего кода, вы оба ссылаетесь на один и тот же объект. Вы не можете сказать, что новые объекты создаются, если вы используете строковые литералы.
Даже если вы так и сказали (потому что они не существуют в пуле, если они не используются нигде в вашем коде), это означает, что независимо от того, будет ли третья строка создавать новые объекты, в основном зависит от того, сколько из этих строк также используется в других местах вашей программы.