[java] Java에서 부울 변수의 크기는 얼마입니까?

누구든지 Java에서 부울 의 비트 크기를 알 수 있습니까 ?



답변

가상 머신에 따라 다릅니다.


답변

가상 머신에 따라 다르지만 Java의 바이트에 대해 묻는 유사한 질문 의 코드를 쉽게 수정할 수 있습니다 .

class LotsOfBooleans
{
    boolean a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
    boolean b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
    boolean c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
    boolean d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
    boolean e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
}

class LotsOfInts
{
    int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af;
    int b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf;
    int c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf;
    int d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df;
    int e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef;
}


public class Test
{
    private static final int SIZE = 1000000;

    public static void main(String[] args) throws Exception
    {
        LotsOfBooleans[] first = new LotsOfBooleans[SIZE];
        LotsOfInts[] second = new LotsOfInts[SIZE];

        System.gc();
        long startMem = getMemory();

        for (int i=0; i < SIZE; i++)
        {
            first[i] = new LotsOfBooleans();
        }

        System.gc();
        long endMem = getMemory();

        System.out.println ("Size for LotsOfBooleans: " + (endMem-startMem));
        System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE)));

        System.gc();
        startMem = getMemory();
        for (int i=0; i < SIZE; i++)
        {
            second[i] = new LotsOfInts();
        }
        System.gc();
        endMem = getMemory();

        System.out.println ("Size for LotsOfInts: " + (endMem-startMem));
        System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE)));

        // Make sure nothing gets collected
        long total = 0;
        for (int i=0; i < SIZE; i++)
        {
            total += (first[i].a0 ? 1 : 0) + second[i].a0;
        }
        System.out.println(total);
    }

    private static long getMemory()
    {
        Runtime runtime = Runtime.getRuntime();
        return runtime.totalMemory() - runtime.freeMemory();
    }
}

다시 말하면 이것은 VM에 따라 다르지만 Sun의 JDK 빌드 1.6.0_11을 실행하는 Windows 랩톱에서 다음과 같은 결과를 얻었습니다.

Size for LotsOfBooleans: 87978576
Average size: 87.978576
Size for LotsOfInts: 328000000
Average size: 328.0

이는 부울이 기본적으로 Sun의 JVM에 의해 각각 바이트로 압축 될 수 있음을 의미합니다.


답변

Java에서 부울 값으로 표시되는 실제 정보는 1 비트입니다. 1은 true, 0은 false입니다. 그러나 메모리에있는 부울 변수의 실제 크기는 Java 사양에 의해 정확하게 정의되지 않습니다. Java의 기본 데이터 유형을 참조하십시오 .

부울 데이터 유형에는 true 및 false의 두 가지 가능한 값만 있습니다. 참 / 거짓 조건을 추적하는 간단한 플래그에이 데이터 유형을 사용하십시오. 이 데이터 유형은 정보의 1 비트를 나타내지 만 “크기”는 정확하게 정의 된 것이 아닙니다.


답변

참고로 …

Boolean 객체 배열을 사용할 생각이라면 사용하지 마십시오. 대신 BitSet을 사용하십시오-성능 최적화가 가능합니다 (그리고 다음 설정 / 설정 해제 비트를 얻을 수있는 몇 가지 멋진 추가 방법).


답변

Java는 boolean데이터 유형에 대해 1 바이트를 예약 하지만 1 비트 만 사용 한다고 읽었습니다 . 그러나 문서에 따르면 “크기”는 정확하게 정의 된 것이 아닙니다 .
여길 봐.


답변

boolean값으로 컴파일 intJVM의 데이터 유형. 를 참조하십시오 여기 .


답변

Java의 부울 크기는 가상 머신에 따라 다릅니다. 그러나 모든 Java 객체는 8 바이트 단위로 정렬됩니다. 부울에는 총 9 바이트의 정보에 대해 8 바이트의 헤더와 1 바이트의 페이로드가 있습니다. JVM은 다음 8의 배수로 반올림하여 java.lang.Boolean의 한 인스턴스가 16 바이트의 메모리를 차지합니다.