Heim  >  Fragen und Antworten  >  Hauptteil

Welche Unterschiede bestehen darin, wie Java-Basistypen als lokale Variablen und Mitgliedsvariablen gespeichert werden?

1. Diese Frage kann viele Aspekte umfassen. Ich habe sie selbst studiert und einen Teil davon verstanden, aber einige Teile sind noch unklar. Fügen Sie zuerst den Code ein (Java-Version 1.8):

public class Test{
    int abc1 = 127;
    Integer abd1 = 127;
    Integer abf1 = 127;
    Integer abe1 = new Integer(127);
    {
        System.out.print("1\t");
        System.out.println(abc1==abd1);
        System.out.print("2\t");
        System.out.println(abd1==abe1);
        System.out.print("3\t");
        System.out.println(abc1==abe1);
        System.out.print("4\t");
        System.out.println(abd1==abf1);
    }

    int abc2 = 128;
    Integer abd2 = 128;
    Integer abf2 = 128;
    Integer abe2 = new Integer(128);
    {
        System.out.print("5\t");
        System.out.println(abc2==abd2);
        System.out.print("6\t");
        System.out.println(abd2==abe2);
        System.out.print("7\t");
        System.out.println(abc2==abe2);
        System.out.print("8\t");
        System.out.println(abd2==abf2);
    }

    public static void main(String[] args){
        Test t =new Test();
    }
/*输出为:
1       true
2       false
3       true
4       true
5       true
6       false
7       true
8       false
*/
}

2. Lassen Sie mich zunächst über den Teil sprechen, den ich klar kenne: Die 4. Ausgabe und die 8. Ausgabe sind relativ klar. Dies liegt daran, dass es im Java-Heap einen Konstantenpool zum Speichern häufig verwendeter Basisdatentypliterale gibt. Dieser Konstantenpool kann Ganzzahlen (-128 bis 127) und boolesche Typen (keine Double-Typen) speichern. Beim Ausführen von „Integer abd1 = 127“ wird nicht nur ein Integer-Objekt mit dem Wert 127 im Heap erstellt, sondern auch 127 im entsprechenden Konstantenpool gespeichert und dieses Integer-Objekt dann mit 127 im Konstantenpool verknüpft „Integer abf1=127“ wird erneut ausgeführt. Zusätzlich zur Erstellung des Objekts wird es auch mit 127 im Konstantenpool verknüpft, sodass ein Vergleich der beiden den Wert „true“ zurückgibt. 128 ist unterschiedlich. Da es den Speicherbereich des Konstantenpools überschreitet, werden nur zwei Ganzzahlreferenzen i1 und i2 verglichen, sodass false zurückgegeben wird.

3. Meine Frage ist: Wie speichere ich den int-Typ (nicht statisch, nicht endgültig) in Objekt-Member-Variablen? Mit anderen Worten, wenn ein Textobjekt t erstellt wird, wird abc1 (ähnlich abc2) direkt im Stapel gespeichert oder gepackt und im Heap gespeichert. Warum wird 1-3 (oder 5-7) angezeigt? „wahr, falsch, wahr“-Situation.

世界只因有你世界只因有你2702 Tage vor549

Antworte allen(1)Ich werde antworten

  • 给我你的怀抱

    给我你的怀抱2017-05-27 17:43:41

    一 int和Integer比较时,Integer会自动拆箱后与int比较
    二 对象实例变量分配在堆上
    1和5比较 由于Integer类型自动拆箱所以为true
    new Integer(xxx) xxx即使在缓存范围之内也会建立新的对象 所以2是false

    Antwort
    0
  • StornierenAntwort