Was sind automatisches Einpacken und automatisches Auspacken? Was ist Integer-Cache? Wie ist die Beziehung zwischen ihnen?
Schauen wir uns zunächst eine Frage an.
Integer a = new Integer(1); Integer b = new Integer(1); System.out.println(a==b); Integer c = 1; Integer d = 1; System.out.println(c==d); Integer e = 128; Integer f = 128; System.out.println(e==f);
Antworte zuerst, schau dir die Antwort später an.
Die Antwort ist falsch wahr falsch, hast du recht?
Nachdem ein Teil erschienen ist, teilen wir die Wissenspunkte gemeinsam
Es gibt acht grundlegende Datentypen in Java, die in drei Kategorien unterteilt werden können:
Zeichentyp: char
Boolescher Typ: boolean
#🎜 🎜#Entsprechende Verpackungsklasse | # 🎜🏜 🎜# Kurz#🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜#int#🎜🎜 ## 🎜🎜#Integer#🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜#Long#🎜🎜 ## 🎜 🎜# Long#### 🎜🎜 ## 🎜🎜 ## 🎜🎜#Float |
---|---|
Die sechs Verpackungsklassen, die numerischen Typen entsprechen, erben alle von der Number-Klasse. | 3. Automatisches Einpacken und automatisches Auspacken |
//基本数据类型转包装类 //1.有参构造 Integer a = new Integer(1); //2.实际上,有参构造的参数也可以是字符串,不过要使用正确的数据,“123abc”不可能会转换为Integer类型 Integer b = new Integer("123"); //3.valueOf() Integer c = Integer.valueOf(123); //包装类转基本数据类型(xxxValue() float是floatValue() double是doubleValue()) int d = a.intValue(); Nach dem Login kopieren | Um ein Objekt zu erhalten, können Sie eine bestimmte Methode verwenden. Um einen Wert zu erhalten, rufen Sie ein bestimmtes Attribut des Objekts auf. Java 5.0 muss nicht mehr so mühsam sein. Neue Funktionen des automatischen Boxens und des automatischen Unboxings wurden hinzugefügt. Tatsächlich sind die beiden Konzepte sehr einfach zu verstehen. |
Werfen wir einen Blick auf den Quellcode von valueOf(). | /** * Returns an {@code Integer} instance representing the specified * {@code int} value. If a new {@code Integer} instance is not * required, this method should generally be used in preference to * the constructor {@link #Integer(int)}, as this method is likely * to yield significantly better space and time performance by * caching frequently requested values. * * This method will always cache values in the range -128 to 127, * inclusive, and may cache other values outside of this range. * * @param i an {@code int} value. * @return an {@code Integer} instance representing {@code i}. * @since 1.5 */ public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } Nach dem Login kopieren | valueOf() gibt nicht einfach ein Integer-Objekt zurück, sondern beurteilt zunächst, ob die Eingabedaten einem bestimmten Bereich entsprechen. Aus den Kommentaren wird dieser Bereich standardmäßig zurückgegeben [-128,127] und kann ein größerer Bereich sein; wenn er diesen Bereich überschreitet, wird ein neues Objekt zurückgegeben. Die verwendeten IntegerCache-Daten sind der Cache von Integer.
Schauen Sie sich den IntegerCache-Quellcode an. | /** * Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initialized on first usage. The size of the cache * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option. * During VM initialization, java.lang.Integer.IntegerCache.high property * may be set and saved in the private system properties in the * sun.misc.VM class. */ private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { try { int i = parseInt(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = Math.min(i, Integer.MAX_VALUE - (-low) -1); } catch( NumberFormatException nfe) { // If the property cannot be parsed into an int, ignore it. } } high = h; cache = new Integer[(high - low) + 1]; int j = low; for(int k = 0; k < cache.length; k++) cache[k] = new Integer(j++); // range [-128, 127] must be interned (JLS7 5.1.7) assert IntegerCache.high >= 127; } private IntegerCache() {} } Nach dem Login kopieren | Wie Sie sehen können, ist IntegerCache eine statische interne Klasse von IntegerCache.cache, die von valueOf() aufgerufen wird, ist ein Array-Objekt im Bereich ist der Standardwert [-128, 127], natürlich (laut Kommentar) kann dieser Bereich auch über die JVM geändert werden (das verstehe ich nicht). Dann wird jedem Element im Array ein Integer-Objekt zugewiesen und der Cache wird gebildet.
Natürlich verfügt nicht nur Integer über einen Caching-Mechanismus, sondern auch Byte, Short, Long und Character verfügen alle über Caching-Mechanismen. Der Bereich von Byte, Short, Integer und Long liegt zwischen -128 und 127 und der Bereich von Character zwischen 0 und 127. | 5. Beantworten Sie die Frage |
2. Automatischer Box- und Caching-Mechanismus, die beiden Objekte sind tatsächlich gleich, das Rückgabeergebnis ist true | #3 Außerhalb des Cache-Bereichs, neu wird während der Ausführung generiert Objekt, die beiden Objekte sind unterschiedlich, das Rückgabeergebnis ist falsch |