Количество объектов, созданных в Java

1

Сколько объектов создано в 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";
    }
  • 1
    для этого будет создан только 2 объекта массива.
  • 0
    Каждый раз, когда вы используете «новый», вы создаете 1 новый объект. Вот и все. Пока вы не заполняете эти массивы, вы только что распределили пространство.
Показать ещё 8 комментариев
Теги:

3 ответа

3
Лучший ответ

Массивы 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      
2

Array объекты Array.

int[] array = new int[10];// can hold 10 ints

String[]  str = new String[10]; // can hold references to 10 Strings
1

Как говорили другие, ваши первые два оператора создают по одному объекту каждый (массив).

Третий немного особенный. Вы создаете String-массив (1 объект), заполненный ссылками на 10 строк (10 объектов). Итак, это 11 объектов.

Не совсем. Строковые литералы в Java объединены, что означает, в основном, что там особое место в памяти, где хранятся все литералы String. Итак, если вы используете строку "string" в двух разных местах вашего кода, вы оба ссылаетесь на один и тот же объект. Вы не можете сказать, что новые объекты создаются, если вы используете строковые литералы.

Даже если вы так и сказали (потому что они не существуют в пуле, если они не используются нигде в вашем коде), это означает, что независимо от того, будет ли третья строка создавать новые объекты, в основном зависит от того, сколько из этих строк также используется в других местах вашей программы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню