Java char
s имеет размер 2 байта (16 бит без знака). Поэтому, если вы хотите 2 МБ, вам нужен миллион символов. С вашим кодом есть две очевидные проблемы:
- Повторный вызов
length()
не нужен. Добавьте любой символ в Java String
, и его длина увеличивается на 1, независимо от того, что это за символ. Возможно, вы путаете это с размером в байтах. Это не значит что; и
- У вас огромные проблемы с фрагментацией памяти в этом коде.
Чтобы дополнительно объяснить (2), оператор конкатенации строк (+
) в Java вызывает создание нового String
, поскольку Java String
s являются неизменяемыми. Итак:
String a = "a";
a += "b";
фактически означает:
String a = "a";
String a = a + "b";
Это иногда сбивает с толку бывших программистов на C ++, поскольку строки в C ++ работают по-разному.
Итак, ваш код фактически выделяет миллион строк для сообщения размером один миллион. Только последний хранится. Остальные - мусор, который будет очищен, но в этом нет необходимости.
Лучшая версия:
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
правильного размера.