Ответ 1
Java char
имеет размер 2 байта (16 бит без знака). Поэтому, если вы хотите 2 МБ, вам нужно миллион символов. В коде есть две очевидные проблемы:
- Повторное вызов
length()
не требуется. Добавьте любого символа в JavaString
, и длина его увеличивается на 1, независимо от того, какой символ. Возможно, вы путаете это с размером в байтах. Это не значит, что; и - У вас есть огромные проблемы с фрагментацией памяти с этим кодом.
Чтобы пояснить (2), оператор конкатенации строк (+
) в Java вызывает создание нового String
, потому что Java String
неизменяемы. Итак:
String a = "a";
a += "b";
на самом деле означает:
String a = "a";
String a = a + "b";
Это иногда путает бывших программистов на С++, поскольку строки работают по-другому в С++.
Таким образом, ваш код фактически выделяет миллион строк для размера сообщения в миллион. Остается только последний. Другие - мусор, который будет очищен, но в этом нет необходимости.
Лучшая версия:
private static String createDataSize(int msgSize) {
StringBuilder sb = new StringBuilder(msgSize);
for (int i=0; i<msgSize; i++) {
sb.append('a');
}
return sb.toString();
}
Ключевым отличием является то, что:
- A
StringBuilder
является изменяемым, поэтому его не нужно перераспределять с каждым изменением; и - В этом примере кода
StringBuilder
предварительно распределяется до нужного размера.
Примечание: проницательный, возможно, заметил, что я сделал:
sb.append('a');
а не:
sb.append("a");
'a'
, конечно, является одним символом, "a"
является String
. Вы можете использовать либо в этом случае.
Однако это не так просто, потому что это зависит от того, как кодируются байты. Обычно, если вы не укажете его иначе, он будет использовать UTF8, который является символами переменной ширины. Таким образом, миллион символов может быть где угодно от 1 МБ до 4 МБ в зависимости от того, в конечном итоге вы его кодируете, и ваш вопрос не содержит подробностей.
Если вам нужны данные определенного размера, и эти данные не имеют значения, моим советом было бы просто использовать массив byte
нужного размера.