[JAVA] Ich habe die Quelle von Short gelesen

Irgendwie habe ich beschlossen, auch die JDK-Quelle zu lesen. Trotzdem habe ich keine Zeit, jede Zeile sorgfältig zu lesen, also habe ich sie kurz gelesen und diesen Code gefunden. Das letzte Mal war ich habe die Quelle von Byte gelesen, also ist als nächstes Short.

Kurze Klasse

Die Short-Klasse ist eine Wrapper-Klasse für den primitiven Typ short. Erstens Felder und Konstruktoren. Nun, es ist eine Quelle, die sich jeder vorstellen kann.

Short.java


    private final short value;

    public Short(short value) {
        this.value = value;
    }

ShortCache-Klasse

Tatsächlich gibt es eine ShortCache-Klasse, die in Javadoc nicht angezeigt wird.

Short.java


    private static class ShortCache {
        private ShortCache(){}

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

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

Ist es nicht eine Kopie der bisherigen Erklärung der Byte-Klasse? !! !! Derzeit besteht der Unterschied zur Byte-Klasse darin, dass Instanzen von -128 bis 127 zwischengespeichert werden. Es scheint, dass ich keine Instanz von -32768 bis 32767 erstellt habe, weil sie kurz ist.

Es ist ein Cache von ShortCache, auf den jedoch von valueOf verwiesen wird.

Short.java


    public static Short valueOf(short s) {
        final int offset = 128;
        int sAsInt = s;
        if (sAsInt >= -128 && sAsInt <= 127) { // must cache
            return ShortCache.cache[sAsInt + offset];
        }
        return new Short(s);
    }

Vergleiche mit dem Vergleichsoperator ==

Derzeit ist es dasselbe wie Byte, und wenn Sie new Short () ausführen, handelt es sich um eine weitere Instanz. Short.valueOf () und Autoboxing sind wahrscheinlich gleich.

Main.java


	public static void main(String[] args) {
		short s00 = 127;
		Short s01 = Short.valueOf(s00);
		Short s02 = s00;
		System.out.println(s01 == s02);
		short s10 = 128;
		Short s11 = Short.valueOf(s10);
		Short s12 = s10;
		System.out.println(s11 == s12);
	}

Ergebnis ist ···

true
false

Nun, es ist natürlich. In valueOf () verwendet 127 oder weniger den Cache, 128 oder mehr ist jedoch neu Short (). Derzeit liegt dieselbe Instanz im Bereich von -127 bis 128, es ist jedoch besser, Referenzwerte nicht zu stark zu vergleichen.

Aber ich benutze den Vergleichsoperator ==

Es scheint jedoch Fälle zu geben, in denen der Vergleichsoperator == verwendet wird.

Main.java


	public static void main(String[] args) {
		short s11 = 128;
		short s12 = 128;
		Short s21 = s11;
		Short s22 = s12;
		System.out.println(s11 == s12);
		System.out.println(s11 == s22);
		System.out.println(s21 == s12);
		System.out.println(s21 == s22);
	}

Das erste ist ein Primitiv, das zweite ist ein Primitiv und ein Wrapper, und das vierte ist ein Wrapper-Vergleich. Tatsächlich sind das zweite und dritte beiläufig Auto-Unboxing. Daher ist das Ergebnis ...

true
true
true
false

Das ist ziemlich hart. Das Ergebnis ändert sich je nachdem, ob das s im Modellnamen unten oder oben ist, was für mich persönlich eine verrückte Stufe ist. Darüber hinaus gelten, wie ich bereits geschrieben habe, -127 bis 128 für alle 4. Wrapper. Wie kann ich dies jemandem erklären, der zum ersten Mal seit einem Monat wie Java ist und es zu 100% richtig versteht?

Es war einmal etwas namens JDK 1.4

Es gibt eine Version namens JDK 1.4, und vorerst kann sogar das aktuelle JDK 1.8 auf dieser 1.4-Ebene kompiliert werden.

$ javac -source 1.4 -target 1.4 Main.java
Warnung: [options]Bootstrap-Klassenpfad-source 1.Nicht mit 4 eingestellt
Warnung: [options]Quellwert 1.4 ist veraltet und wird in einer zukünftigen Version entfernt
Warnung: [options]Zielwert 1.4 ist veraltet und wird in einer zukünftigen Version entfernt
Warnung: [options] 廃止されたオプションについてのWarnungを表示しないようにするには、-Xlint:Verwenden Sie die Option.
Main.java:15:Error:Inkompatibler Typ:Short kann nicht in Short konvertiert werden:
                Short s21 = s11;
                            ^
Main.java:16:Error:Inkompatibler Typ:Short kann nicht in Short konvertiert werden:
                Short s22 = s12;
                            ^
Main.java:18:Error:Binäroperator'=='Der Operandentyp von ist ungültig
                System.out.println(s11 == s22);
                                       ^
Erster Typ: short
Zweiter Typ: Short
Main.java:19:Error:Binäroperator'=='Der Operandentyp von ist ungültig
                System.out.println(s21 == s12);
                                       ^
Erster Typ: Short
Zweiter Typ: short
4 Fehler
4 Warnungen

Eigentlich ist auch JDK 1.4 selbst enthalten,

$ javac Main.java
Main.java:15:Inkompatibler Typ
Erkannter Wert: short
Erwarteter Wert: java.lang.Short
                Short s21 = s11;
                            ^
Main.java:16:Inkompatibler Typ
Erkannter Wert: short
Erwarteter Wert: java.lang.Short
                Short s22 = s12;
                            ^
Main.java:18:Operator==Ist kurz,java.lang.Gilt nicht für Short.
                System.out.println(s11 == s22);
                                       ^
Main.java:19:Operator==Ist Java.lang.Short,Gilt nicht für Kurzschlüsse.
                System.out.println(s21 == s12);
                                       ^
4 Fehler

Die Fehlermeldung ist etwas anders. Der Grund für den Fehler ist, dass seit JDK 1.5 Autoboxing / Unboxing hinzugefügt wurde. Was für eine Quelle haben Sie vor JDK 1.4 geschrieben?

Main.java


	public static void main(String[] args) {
		short s11 = 128;
		short s12 = 128;
		Short s21 = Short.valueOf(s11);
		Short s22 = Short.valueOf(s12);
		System.out.println(s11 == s12);
		System.out.println(s11 == s22.shortValue());
		System.out.println(s21.shortValue() == s12);
		System.out.println(s21 == s22);
	}

Es scheint tatsächlich so

Main.java


	public static void main(String[] args) {
		short s11 = 128;
		short s12 = 128;
		Short s21 = new Short(s11);
		Short s22 = new Short(s12);
		System.out.println(s11 == s12);
		System.out.println(s11 == s22.shortValue());
		System.out.println(s21.shortValue() == s12);
		System.out.println(s21 == s22);
	}

Was ist es? Short.valueOf (short) ist eine Methode, die aus JDK 1.5 hinzugefügt wurde. Wenn ich mit javac -source 1.4 -target 1.4 mit JDK 1.8 kompiliere, kann ich es kompilieren.

Ich denke, es wäre einfacher zu verstehen gewesen, wenn es kein automatisches Unboxing gegeben hätte.

Vergleichsmethode

Es gibt eine Methode namens compare, aber zum leichteren Verständnis ordnen wir sie als Byte, Short, Integer, Long an.

Byte.java


    public static int compare(byte x, byte y) {
        return x - y;
    }

Short.java


    public static int compare(short x, short y) {
        return x - y;
    }

Integer.java


    public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }

Long.java


    public static int compare(long x, long y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }

Kannst du den Unterschied sehen? Obwohl ich ein Int in meiner eigenen Klasse war, habe ich es übersprungen und return x --y geschrieben; Es funktioniert irgendwie, aber im Extremfall läuft es bei x = 0x7FFFFFFF über; y = -1. Deshalb ist es ein Fehler.

Byte und Short geben also x - y zurück, da das Ergebnis in den Bereich von int fällt.

toUnsignedInt-Methode, toUnsignedLong-Methode

Dies ist das heutige Highlight. Ich meine, gab es so etwas? Wenn Sie so denken, wird es in JDK 1.8 hinzugefügt.

Short.java


    public static int toUnsignedInt(short x) {
        return ((int) x) & 0xffff;
    }

    public static long toUnsignedLong(short x) {
        return ((long) x) & 0xffffL;
    }

Was zu tun ist, ist von einem signierten Short in einen nicht signierten Short zu konvertieren. Da dies jedoch nicht durch Short ausgedrückt werden kann, wird es durch Int oder Long zurückgegeben. Da ich aus der C-Sprache zu Java gekommen bin, denke ich, dass ich es selbst schreiben sollte, aber ich denke, dass es besser ist, das vorbereitete zu verwenden, wie ein Makro in der C-Sprache. Ich werde.

Schließlich

Normalerweise benutze ich nicht Short, sondern Integer.

Recommended Posts

Ich habe die Quelle von Short gelesen
Ich habe die Quelle von ArrayList gelesen, die ich gelesen habe
Ich habe die Quelle von Integer gelesen
Ich habe die Quelle von Long gelesen
Ich habe die Quelle von Byte gelesen
Ich habe die Quelle von String gelesen
Ich habe das Kotlin-Startbuch gelesen
Ist drainTo von LinkedBlockingQueue sicher? Ich bin der Quelle gefolgt
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe die interne Verarbeitung von Retrofit untersucht
[Tag: 5] Ich habe die Grundlagen von Java zusammengefasst
Ich habe den Teil von java.net.URL # getPath überprüft
Ich habe die Grundlagen der Zeicheneingabe verstanden
Ich habe die Eigenschaften von Java und .NET verglichen
Ich möchte den Inhalt der Absicht var_dump
Ich habe versucht, den Profiler von IntelliJ IDEA zu verwenden
Ich habe die Anzahl der Taxis mit Ruby überprüft
Probieren Sie Progate Free Edition [Java I]
[Java] So erhalten Sie die URL der Übergangsquelle
Ich habe den Lebenszyklus der Erweiterung von JUnit Jupiter untersucht
Die Welt der Clara-Regeln (2)
Ich habe versucht, die Server-Push-Funktion von Servlet 4.0 zu verwenden
Ich habe den lesbaren Code gelesen, machen Sie sich also eine Notiz
Ich war süchtig nach der Aufzeichnung des zugehörigen Modells
Ich habe die Listenansicht der Android-Entwicklung gemeinsam gesehen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Beurteilung des Kalenders
Ich habe den neuen Feature-Profiler von IntelliJ IDEA 2019.2 ausprobiert.
Ich möchte die Antwort der Janken-App wissen
Bildverarbeitung: Grundstruktur des vom Programm gelesenen Bildes
Ich möchte den Namen des Posters des Kommentars anzeigen
Ich habe das Anzeigeformat der JSON-Antwort von Rails zusammengefasst
Die Welt der Clara-Regeln (1)
Die Welt der Clara-Regeln (3)
Quelle zellulärer Objekte
Lesen Sie das Rails-Handbuch erneut (Übersicht über Action Controller).
[Java] Beim Schreiben der Quelle ... Memorandum ①
Ich habe ein Sequenzdiagramm des j.u.c.Flow-Beispiels geschrieben
Ich habe die Typen und Grundlagen von Java-Ausnahmen zusammengefasst
Die Idee der schnellen Sortierung
Ich bin mir der Bequemlichkeit des Graphql-Code-Generators Teil 2 sehr bewusst
Ich kann den Bildschirm der Rails-Datenbankkonsole nicht verlassen
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Die Idee von jQuery
Ich habe das Verhalten von Java Scanner und .nextLine () nicht wirklich verstanden.
Ich habe einen Blick in die Java HashMap geworfen
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Geben Sie beim Erstellen mit Maven den Zeichencode der Quelle an