[JAVA] J'ai lu la source de Byte

D'une manière ou d'une autre, j'ai décidé de lire également la source JDK. Cela dit, je n'ai pas le temps de lire attentivement chaque ligne, alors je l'ai lu brièvement et j'ai trouvé ce code.

Classe d'octets

La classe Byte est une classe wrapper pour l'octet de type primitif. Il semble que je n'ai rien trouvé en lisant la source, ce qui est surprenant.

Premièrement, les champs et les constructeurs. Eh bien, c'est une source que tout le monde peut imaginer.

Byte.java


    private final byte value;

    public Byte(byte value) {
        this.value = value;
    }

Classe ByteCache

En fait, il existe une classe ByteCache qui ne peut pas être vue dans javadoc.

Byte.java


    private static class ByteCache {
        private ByteCache(){}

        static final Byte cache[] = new Byte[-(-128) + 127 + 1];

        static {
            for(int i = 0; i < cache.length; i++)
                cache[i] = new Byte((byte)(i - 128));
        }
    }

Ce que nous faisons, c'est la mise en cache des instances de -128 à 127. Oh, cela signifie que toutes les valeurs d'octets sont dans le cache.

C'est un cache de ByteCache, mais il est référencé par valueOf.

Byte.java


    public static Byte valueOf(byte b) {
        final int offset = 128;
        return ByteCache.cache[(int)b + offset];
    }

Comparer avec l'opérateur de comparaison ==

Si l'instance est dans le cache, vous pouvez la comparer avec l'opérateur ==. Essaie.

Main.java


	public static void main(String[] args) {
		byte b0 = 1;
		Byte b1 = new Byte(b0);
		Byte b2 = Byte.valueOf(b0);
		Byte b3 = b0;
		System.out.println(b1 == b2);
		System.out.println(b1 == b3);
		System.out.println(b2 == b3);
	}

Le résultat est ···

false
false
true

C'est dommage. Il est tout à fait naturel que new Byte () crée une autre instance, mais la valeur de référence de l'instance sera différente. Cependant, le fait que l'autoboxing (variable b3) soit identique à Byte.valueOf () signifie que l'autoboxing appelle Byte.valueOf () au lieu de new Byte ().

Outre ...

Eh bien pas vraiment. En parlant de force, si vous écrivez de nouveaux Byte (1) ou Byte.valueOf (1), le compilateur se fâche que le type int ne puisse pas être converti en type byte, mais vous pouvez voir que la constante ne dépasse pas la plage d'octets! Je me sens comme. Le compilateur semble intelligent et assez têtu, je veux donc qu'il soit un peu plus flexible.

Recommended Posts

J'ai lu la source de Byte
J'ai lu la source de ArrayList que j'ai lu
J'ai lu la source d'Integer
J'ai lu la source de Short
J'ai lu la source de String
J'ai lu le livre de démarrage de Kotlin
DrainTo de LinkedBlockingQueue est-il sûr? J'ai suivi la source
05. J'ai essayé de supprimer la source de Spring Boot
J'ai étudié le traitement interne de Retrofit
[jour: 5] J'ai résumé les bases de Java
J'ai compris les bases de la saisie de caractères
J'ai comparé les caractéristiques de Java et .NET
Je veux var_dump le contenu de l'intention
J'ai essayé d'utiliser le profileur d'IntelliJ IDEA
J'ai vérifié le nombre de taxis avec Ruby
Essayez Progate Free Edition [Java I]
[Java] Comment obtenir l'URL de la source de transition
J'ai essayé d'utiliser la fonction Server Push de Servlet 4.0
J'ai lu le code lisible, alors prends note
J'étais accro au record du modèle associé
J'ai vu la liste du développement Android collectivement
J'ai essayé de réduire la capacité de Spring Boot
Jugement du calendrier
J'ai essayé le nouveau profileur de fonctionnalités d'IntelliJ IDEA 2019.2.
Le monde de Clara-Rules (4)
Je veux connaître la réponse de l'application Janken
Traitement d'image: structure de base de l'image lue par le programme
Je souhaite afficher le nom de l'affiche du commentaire
J'ai résumé le format d'affichage de la réponse JSON de Rails
Le monde de Clara-Rules (1)
Le monde de Clara-Rules (3)
Lire la source Java HashMap
J'ai lu le "Guide pratique orienté objet", donc un mémorandum
Source des objets cellulaires
Relisez le guide des rails (vue d'ensemble du contrôleur d'action)
J'ai écrit un diagramme de séquence de l'exemple j.u.c.Flow
Le monde de Clara-Rules (5)
J'ai résumé les types et les bases des exceptions Java
L'idée du tri rapide
Je suis parfaitement conscient de la commodité de graphql-code-generator partie 2
Je ne peux pas sortir de l'écran de la console Rails db
Je veux retourner la position de défilement de UITableView!
L'idée de jQuery
J'ai créé le côté serveur du jeu de cartes en ligne ①
Je n'ai pas vraiment compris le comportement de Java Scanner et .nextLine ()
J'ai jeté un coup d'œil à l'intérieur du Java HashMap
J'ai essayé de résumer les bases de kotlin et java
[Android] Quittez l'activité de la source de transition au moment de la transition d'écran
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
J'ai essayé JAX-RS et pris note de la procédure
Spécifiez le code de caractère de la source lors de la construction avec Maven