89 votes

Quelle est la taille d'une variable booléenne en java?

Peut on dire la taille en bits de booléens en java?

186voto

Jon Skeet Points 692016

Cela dépend de la machine virtuelle, mais il est facile d'adapter le code à partir d'une même question de poser à propos des octets en 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();
    }
}

Pour rappel, c'est VM-dépendante, mais sur mon ordinateur portable Windows exécutant Sun JDK construire 1.6.0_11 j'ai obtenu les résultats suivants:

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

Cela suggère que les booléens peuvent être emballés dans un octet chacun par Sun JVM.

41voto

Warrior Points 13394

Sa dépend de la machine virtuelle.

31voto

William Brendel Points 15453

L'information elle-même représentée par une valeur booléenne en Java est un bit: 1 pour true, 0 pour faux. Cependant, la taille réelle d'une variable booléenne dans la mémoire n'est pas précisément défini par la spécification de Java. Voir Types de Données Primitifs en Java.

Le type de données boolean a seulement deux valeurs possibles: true et false. Utilisation ce type de données pour de simples indicateurs de piste true/false conditions. Ces données type représente un bit de les informations, mais sa "taille" n'est-ce pas quelque chose qui est précisément défini.

21voto

Matthew Schinckel Points 15596

Sur une note de côté...

Si vous envisagez d'utiliser un tableau de Booléen objets, n'en ont pas. Utiliser un BitSet au lieu de cela il a une certaine optimisation des performances (et quelques belles méthodes supplémentaires, vous permettant d'obtenir la prochaine définir/annuler bits).

6voto

JavaNewbie_M107 Points 553

J'ai lu que Java se réserve un octet pour un boolean type de données, mais il utilise seulement un peu. Toutefois, la documentation dit que "sa "taille" n'est pas quelque chose qui est précisément définies". Voir ici.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X