Java에서 String이 있으면 x
해당 문자열의 바이트 수를 어떻게 계산할 수 있습니까?
답변
문자열은 문자 목록입니다 (예 : 코드 포인트). 문자열을 나타내는 데 사용되는 바이트 수는 문자열 을 바이트로 변환하는 데 사용하는 인코딩에 전적으로 달려 있습니다 .
즉, 문자열을 바이트 배열로 바꾸고 다음과 같이 크기를 볼 수 있습니다.
// The input string for this test
final String string = "Hello World";
// Check length, in characters
System.out.println(string.length()); // prints "11"
// Check encoded sizes
final byte[] utf8Bytes = string.getBytes("UTF-8");
System.out.println(utf8Bytes.length); // prints "11"
final byte[] utf16Bytes= string.getBytes("UTF-16");
System.out.println(utf16Bytes.length); // prints "24"
final byte[] utf32Bytes = string.getBytes("UTF-32");
System.out.println(utf32Bytes.length); // prints "44"
final byte[] isoBytes = string.getBytes("ISO-8859-1");
System.out.println(isoBytes.length); // prints "11"
final byte[] winBytes = string.getBytes("CP1252");
System.out.println(winBytes.length); // prints "11"
따라서 간단한 “ASCII”문자열조차 사용되는 인코딩에 따라 표현에 다른 바이트 수를 가질 수 있습니다. 귀하의 사례에 관심있는 문자 세트를에 대한 인수로 사용하십시오 getBytes()
. UTF-8이 모든 문자를 단일 바이트로 표현한다고 가정하는 함정에 빠지지 마십시오 .
final String interesting = "\uF93D\uF936\uF949\uF942"; // Chinese ideograms
// Check length, in characters
System.out.println(interesting.length()); // prints "4"
// Check encoded sizes
final byte[] utf8Bytes = interesting.getBytes("UTF-8");
System.out.println(utf8Bytes.length); // prints "12"
final byte[] utf16Bytes= interesting.getBytes("UTF-16");
System.out.println(utf16Bytes.length); // prints "10"
final byte[] utf32Bytes = interesting.getBytes("UTF-32");
System.out.println(utf32Bytes.length); // prints "16"
final byte[] isoBytes = interesting.getBytes("ISO-8859-1");
System.out.println(isoBytes.length); // prints "4" (probably encoded "????")
final byte[] winBytes = interesting.getBytes("CP1252");
System.out.println(winBytes.length); // prints "4" (probably encoded "????")
(문자 집합 인수를 제공하지 않으면 플랫폼의 기본 문자 집합 이 사용됩니다. 일부 상황에서는 유용 할 수 있지만 일반적으로 기본값에 의존하지 말고 인코딩 / 디코딩이 필요합니다.)
답변
64 비트 참조로 실행중인 경우 :
sizeof(string) =
8 + // object header used by the VM
8 + // 64-bit reference to char array (value)
8 + string.length() * 2 + // character array itself (object header + 16-bit chars)
4 + // offset integer
4 + // count integer
4 + // cached hash code
다시 말해:
sizeof(string) = 36 + string.length() * 2
압축 된 OOP (-XX : + UseCompressedOops)가있는 32 비트 VM 또는 64 비트 VM에서 참조는 4 바이트입니다. 따라서 총계는 다음과 같습니다.
sizeof(string) = 32 + string.length() * 2
문자열 객체에 대한 참조는 고려하지 않습니다.
답변
pedantic 답변 (결과로 무엇을 하려는지에 따라 가장 유용한 것은 아니지만)는 다음과 같습니다.
string.length() * 2
Java 문자열은 UTF-16BE
코드 단위로 2 바이트를 사용하는 인코딩에 실제로 저장되며 String.length()
UTF-16 코드 단위로 길이를 측정하므로 다음과 같습니다.
final byte[] utf16Bytes= string.getBytes("UTF-16BE");
System.out.println(utf16Bytes.length);
그리고 이것은 내부 char
배열 의 크기를 바이트 단위로 알려줍니다 .
참고 : 이전 인코딩이 배열 길이에 2 바이트를 추가 하여 BOM 을 삽입 할 때와 "UTF-16"
다른 결과가 제공 됩니다."UTF-16BE"
답변
Java에서 문자열을 UTF8 바이트 배열로 변환하는 방법에 따르면 :
String s = "some text here";
byte[] b = s.getBytes("UTF-8");
System.out.println(b.length);
답변
String
인스턴스 메모리 바이트의 특정 량을 할당한다. 아마도 sizeof("Hello World")
데이터 구조 자체에 의해 할당 된 바이트 수를 반환하는 것을 찾고 있습니까?
Java에서는 sizeof
데이터 구조를 저장하기 위해 메모리를 할당하지 않으므로 일반적으로 함수 가 필요 하지 않습니다. String.java
대략적인 추정을 위해 파일을 살펴볼 수 있으며 ‘int’, 일부 참조 및 a를 볼 수 char[]
있습니다. Java 언어 사양 을 정의는 것으로 char
0 ~ 65535 범위는, 그래서 2 바이트 메모리에 하나의 문자를 유지하기에 충분합니다. 그러나 JVM은 하나의 문자를 2 바이트로 저장할 필요가 없으며, 구현시 char
정의 범위의 값을 보유 할 수 있음을 보장해야합니다 .
따라서 sizeof
실제로 Java에서는 의미가 없습니다. 그러나 우리가 큰 문자열과 하나를 가지고 있다고 가정하면char
2 바이트를 할당String
객체 의 메모리 공간은 적어도 2 * str.length()
바이트입니다.