Java에서 문자열의 최대 길이 - 호출 길이() 메서드
Java에서 최대 크기 a는 얼마입니까?String
는 가지고 있을 수, 이 오브젝트는 있을 수 있습니다.length()
★★★★★★★★★★★★★★★★?
는 그것을 있다.length()
를 String
로 char []
;
클래스의 메서드를 고려하면int
이 메서드에서 반환되는 최대 길이는 입니다.2^31 - 1
(20파운드)
「」등).char[]
은 아마 되어 있을 것입니다.String
s), 10장: Java Language Specification, Java SE 7 Edition의 Arrays는 다음과 같습니다.
배열에 포함된 변수에는 이름이 없습니다. 대신 음이 아닌 정수 인덱스 값을 사용하는 배열 액세스 식에 의해 참조됩니다.이러한 변수를 배열의 구성 요소라고 합니다.어레이에 다음이 있는 경우
n
은요, '성분'이라고 해요.n
배열의 길이입니다.배열의 컴포넌트는 다음 정수 인덱스를 사용하여 참조됩니다.0
로로 합니다.n - 1
, 함함.
또한 인덱싱은 다음과 같아야 합니다.int
제10.4절에 언급된 바와 같이 값:
.
int
표시
따라서, 한계는 실제로 다음과 같습니다.2^31 - 1
는 음이 '음'의이기 때문입니다int
discloss.discloss 。
그러나 어레이의 최대 할당 가능 크기 등 다른 제한이 있을 수 있습니다.
java.io.DataInput.readUTF()
★★★★★★★★★★★★★★★★★」java.io.DataOutput.writeUTF(String)
라고 String
오브젝트는 2바이트 길이의 정보와 문자열 내의 모든 문자의 변경된 UTF-8로 나타납니다.여기서 String의 길이는 스트링의 변경된 UTF-8 표현 바이트 수에 의해 제한됩니다.DataInput
★★★★★★★★★★★★★★★★★」DataOutput
.
또한 Java 가상 시스템 규격에 있는 의 규격은 다음과 같이 구조를 정의합니다.
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
length의 크기는 2바이트임을 알 수 있습니다.
메서드의 " " " " )String.length()
는 )개요int
「」라고는 할 수 없습니다.Integer.MAX_VALUE
의 경우, 「」, 「」, 「」, 「」,int
이치노 언어 .int
int
전에 (내) 가 선택하기 위한 입니다.int
★★★★★★★★★★★★★★★★★★★★★★★★★★★
컴파일 시 최대 길이는 최대 65536입니다.이 길이는 변경된 UTF-8 표현 바이트 수이며 의 문자 수가 아님에 주의해 주십시오.String
★★★★★★ 。
String
오브젝트는 런타임에 훨씬 더 많은 문자를 가질 수 있습니다. 을 사용하는 는, 「」를 사용합니다.String
에는 「」가 있습니다.DataInput
★★★★★★★★★★★★★★★★★」DataOutput
긴 하지 않는 이 좋습니다.String
저는 Objective-C의 Objective-C에 상당하는 Objective-C를 구현했을 때 이 를 발견했습니다.DataInput.readUTF()
★★★★★★★★★★★★★★★★★」DataOutput.writeUTF(String)
.
는 정수로 색인화해야 합니다.Integer.MAX_INT
(2-131 또는 2 147 483 647)이것은, 물론, 그 사이즈의 어레이를 격납할 수 있는 충분한 메모리가 있는 것을 전제로 하고 있습니다.
저는 8GB RAM을 탑재한 2010년형 iMac을 사용하고 있으며, Eclipse Neon을 실행하고 있습니다.2Java 1.8.0_25를 사용한 릴리스(4.6.2).VM 인수 -Xmx6g을 사용하여 다음 코드를 실행했습니다.
StringBuilder sb = new StringBuilder();
for (int i = 0; i < Integer.MAX_VALUE; i++) {
try {
sb.append('a');
} catch (Throwable e) {
System.out.println(i);
break;
}
}
System.out.println(sb.toString().length());
다음의 출력이 있습니다.
Requested array size exceeds VM limit
1207959550
따라서 최대 어레이 크기는 ~1,207,959,549인 것 같습니다.그리고 Java의 메모리가 부족해도 실제로는 상관없다는 것을 깨달았습니다.즉, 최대 어레이 크기(어디선가 항상 정의되어 있는 것 같음)를 찾고 있을 뿐입니다.그래서:
for (int i = 0; i < 1_000; i++) {
try {
char[] array = new char[Integer.MAX_VALUE - i];
Arrays.fill(array, 'a');
String string = new String(array);
System.out.println(string.length());
} catch (Throwable e) {
System.out.println(e.getMessage());
System.out.println("Last: " + (Integer.MAX_VALUE - i));
System.out.println("Last: " + i);
}
}
인쇄 대상:
Requested array size exceeds VM limit
Last: 2147483647
Last: 0
Requested array size exceeds VM limit
Last: 2147483646
Last: 1
Java heap space
Last: 2147483645
Last: 2
따라서 최대값은 Integer인 것 같습니다.MAX_VALUE - 2 또는 (2^31) - 3
왜제 P.S.가 아닌지는 잘 .StringBuilder
에 상한선인.1207959550
my my whilechar[]
( (2^31)-3에서 를 기록했습니다. 것 AbstractStringBuilder
로 늘리다char[]
아마 그게 문제의 원인일 거예요
0x7FFFF (2147483647)의 int에 바인드 되어 있는 것 같습니다.
String 클래스의 length() 메서드의 반환 유형은 int입니다.
public int length()
http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#length() 를 참조해 주세요.
따라서 int의 최대값은 2147483647입니다.
문자열은 내부적으로 char 배열로 간주되므로 인덱싱은 최대 범위 내에서 수행됩니다.이는 2147483648번째 멤버를 인덱싱할 수 없음을 의미합니다.따라서 Java에서 String의 최대 길이는 2147483647입니다.
기본 데이터 유형 int는 Java로 4바이트(32비트)입니다.1비트(MSB)가 시그니처 비트로 사용되기 때문에범위는 -2^31 ~2^31-1(-2147483648 ~2147483647)로 제한됩니다.인덱싱에 음수 값을 사용할 수 없습니다.따라서 사용할 수 있는 범위는 0 ~2147483647입니다
가와사키 다카히코의 답변에서 설명한 바와 같이, java는 수정된 UTF-8 형식의 유니코드 문자열을 나타내며, JVM-Spec CONT_UTF8_info Structure에서는 2바이트가 길이에 할당됩니다(String 문자 수가 아닙니다).
ASM jvm 바이트 코드라이브러리 메서드에 다음 내용이 포함되어 있습니다.
public ByteVector putUTF8(final String stringValue) {
int charLength = stringValue.length();
if (charLength > 65535) {
// If no. of characters> 65535, than however UTF-8 encoded length, wont fit in 2 bytes.
throw new IllegalArgumentException("UTF8 string too large");
}
for (int i = 0; i < charLength; ++i) {
char charValue = stringValue.charAt(i);
if (charValue >= '\u0001' && charValue <= '\u007F') {
// Unicode code-point encoding in utf-8 fits in 1 byte.
currentData[currentLength++] = (byte) charValue;
} else {
// doesnt fit in 1 byte.
length = currentLength;
return encodeUtf8(stringValue, i, 65535);
}
}
...
}
, 「」, 「1바이트」를 합니다.encodeUTF8
★★★★
final ByteVector encodeUtf8(final String stringValue, final int offset, final int maxByteLength /*= 65535 */) {
int charLength = stringValue.length();
int byteLength = offset;
for (int i = offset; i < charLength; ++i) {
char charValue = stringValue.charAt(i);
if (charValue >= 0x0001 && charValue <= 0x007F) {
byteLength++;
} else if (charValue <= 0x07FF) {
byteLength += 2;
} else {
byteLength += 3;
}
}
...
}
길이이며 "65535"가 아닙니다.char
를 세다
위의 utf8 구조 링크에서 JVM의 수정된 유니코드 코드 포인트 범위를 찾을 수 있습니다.
언급URL : https://stackoverflow.com/questions/816142/strings-maximum-length-in-java-calling-length-method
'programing' 카테고리의 다른 글
package.json의 'main' 파라미터를 사용하는 방법 (0) | 2022.09.28 |
---|---|
MySQL/MariaDB에서 두 개의 큰 테이블을 결합하는 방법 (0) | 2022.09.28 |
MySQL 데이터베이스의 모든 트리거를 나열하려면 어떻게 해야 합니까? (0) | 2022.09.28 |
현재 날짜/시간이 설정된 날짜/시간을 지났는지 어떻게 확인할 수 있나요? (0) | 2022.09.28 |
두 번째 모드를 닫은 후 포커스가 잘못됨 (0) | 2022.09.28 |