web-dev-qa-db-fra.com

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

Quelqu'un peut-il indiquer la taille de bits de boolean en Java?

89
DonX

Cela dépend de la machine virtuelle.

41
Warrior

Cela dépend de la machine virtuelle, mais il est facile d'adapter le code à partir de question similaire à 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();
    }
}

Je le répète, cela dépend de la machine virtuelle, mais sur mon ordinateur portable Windows exécutant la version 1.6.0_11 du JDK de Sun, 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 regroupés dans un octet chacun par la machine virtuelle Java de Sun.

186
Jon Skeet

Les informations réelles représentées par une valeur booléenne dans Java correspondent à un bit: 1 pour vrai, 0 pour faux. Cependant, la taille réelle d'une variable booléenne en mémoire n'est pas définie avec précision par la spécification Java. Voir Types de données primitifs en Java .

Le type de données booléen n'a que deux valeurs possibles: true et false. Utilisez ce type de données pour les indicateurs simples qui suivent les conditions vraies/fausses. Ce type de données représente un bit d'information, mais sa "taille" n'est pas définie avec précision.

31
William Brendel

Sur une note de côté ...

Si vous envisagez d'utiliser un tableau d'objets booléens, ne le faites pas. Utilisez plutôt un BitSet - il a quelques optimisations de performances (et quelques méthodes supplémentaires de Nice, vous permettant d’obtenir le prochain bit set/unset).

21
Matthew Schinckel

J'ai lu que Java réserve un octet pour un type de données boolean, mais il n'utilise qu'un bit. Cependant, la documentation indique que "sa" taille "n'est pas définie avec précision". Voir ici.

6
JavaNewbie_M107

Les valeurs boolean sont compilées dans le type de données int dans la JVM. Voir ici .

2
rics

La taille du booléen dans Java dépend de la machine virtuelle. Cependant, tout objet Java est aligné sur une granularité de 8 octets. Un booléen a 8 octets d'en-tête, plus 1 octet de charge utile, pour un total de 9 octets d'informations, que la machine virtuelle Java arrondit ensuite au multiple de 8. suivant, de sorte que l'instance unique de Java.lang.Boolean occupe 16 octets de mémoire.

2
Deepak Odedara

C'est indéfini; faire des choses comme Jon Skeet a suggéré de vous donner une approximation sur une plate-forme donnée, mais le moyen de savoir précisément pour une plate-forme spécifique consiste à utiliser un profileur.

0
Lawrence Dol