Сколько символов может содержать Java StringBuilder?

Есть ли у StringBuilder ограничение на количество символов для максимальной емкости в JAVA.

StringBuilder url=new StringBuilder();

stmt = connnection.createStatement();
String sql="SOME QUERY";
rs = stmt.executeQuery(sql);
while(rs.next())
{
    String emailId=rs.getString("USER_EMAIL_ID");
     url.append(emailId);  
}

имеет ли переменная StringBuilder «url» максимальную емкость или она может содержать все?


person Narendra Rawat    schedule 28.06.2016    source источник


Ответы (3)


Да, у него есть ограничение на максимальное целое число, которое 2147483647 (технически).

StringBuilder внутренне хранит символы в char[], а размер массива ограничен. подробнее об этом в другой ветке

person Subhrajyoti Majumder    schedule 28.06.2016
comment
и что произойдет, если он превысит максимальный предел? - person Narendra Rawat; 28.06.2016

Если вы пройдете по этой ссылке, это может очистить вас больше Oracle Docs String Builder Буферная емкость

Теперь вы хотите объявить емкость любого класса StringBuilder, тогда для этого определен один конструктор StringBuilder(int initCapacity).

StringBuilder(int initCapacity) :- Создает построитель пустой строки с указанной начальной емкостью.

Здесь из-за параметра int максимальная емкость, которую может достичь класс StringBuilder, будет 2147483647.

существуют различные методы относительно этого контекста емкости в классе StringBuilder, эти методы также учитывают параметры типа int.

void setLength(int newLength): — устанавливает длину последовательности символов. Если newLength меньше, чем length(), последние символы в последовательности символов усекаются. Если newLength больше, чем length(), нулевые символы добавляются в конце последовательности символов.

void sureCapacity(int minCapacity): — гарантирует, что емкость по крайней мере равна указанному минимуму.

эти методы также принимают аргумент типа int. Итак, используя эти методы или конструкторы, вы сможете создать объект с максимальной емкостью 2147483647.

person Vikrant Kashyap    schedule 28.06.2016
comment
Ни один из показанных вами методов не имеет ничего общего с максимальной емкостью, о чем и идет речь. В приведенной вами ссылке ничего не говорится о максимальной емкости. Что касается вашего последнего предложения, то, что параметр является int, не означает, что вы не получите ошибку, если укажете максимально возможное целочисленное значение, а new StringBuilder(Integer.MAX_VALUE) получит OutOfMemoryError: Requested array size exceeds VM limit независимо от того, сколько памяти вы назначаете виртуальной машине . Короче говоря, ни одна часть этого ответа не является актуальной и точной для вопроса. - person Andreas; 28.06.2016
comment
@ Андреас, да, ты прав. Если недостаточно памяти, это вызовет ошибку OutOfMemory JVM. Я не упомянул ошибку. Спасибо - person Vikrant Kashyap; 28.06.2016
comment
Даже если доступно достаточно памяти, это не означает, что new char[Integer.MAX_VALUE] будет работать. Максимальный размер массива может быть ограничен другими ограничениями, зависящими от платформы. - person Andreas; 28.06.2016

В Java 9 появился JEP 254: компактные строки. Это позволяет более эффективно хранить строки, сохраняя символы в массиве байтов. Если все символы латинские 1, для каждого символа используется один байт, в противном случае используются два байта для каждого символа.

Таким образом, ответ таков: если компактные строки включены (по умолчанию) и ваш StringBuilder содержит только символы Latin 1, максимальный размер Integer.MAX_VALUE*, в противном случае Integer.MAX_VALUE / 2*.


* Или немного меньше, см. "Есть ли у массивов Java максимальный размер?"

person Marcono1234    schedule 02.11.2019