At first, I want to learn how automatic unpacking and automatic boxing are attracted to this name, it sounds like a very high-end appearance, in fact, automatic unpacking, automatic boxing is very simple content.
Automatic unpacking and Automatic packing
Java provides a wrapper type for each of the basic data types. As an example:
Public class testmain{ publicstaticvoid main (string[] args) { = }}
This process automatically creates the corresponding integer object based on the value, which is automatic boxing. Look at another piece of code:
Public class testmain{ publicstaticvoid main (string[] args) { = 10 ; int i = integer; }}
This process automatically converts the data to the basic type according to the wrapper type, which is the automatic unpacking.
The principle of automatic boxing and automatic unpacking is also simple. From the command-line program, enter Classpath (the path where the. class file is located in the bin directory), and JAVAP to see the resulting bytecode:
There's a lot of anti-compilation stuff, and we're just focusing on the key parts:
1 Public Static voidMain (java.lang.string[]);2 Flags:acc_public, Acc_static3 Code:4Stack=1, locals=3, args_size=150: Iconst_161:invokestatic #16//Method Java/lang/integer.valueo7F: (I) ljava/lang/Integer;84: Astore_195: Aload_1Ten6:invokevirtual #22//Method Java/lang/integer.intval One UE: () I A9: istore_2 -10:return
The Java Virtual opportunity automatically calls the integer valueof method when it is automatically boxed, that is, line 6th, and the Java Virtual Opportunity automatically calls the integer Intvalue method when the box is automatically removed, which is line 10th. This is the principle of automatic unpacking and automatic boxing.
Small traps
Look at the two pieces of code, the first piece of code is:
Public class testmain{ publicstaticvoid main (string[] args) { = 100 ; = +; = $; = $; = = i2) ; = = i4);} }
The result of the operation is:
true false
The second piece of code is:
Public class testmain{ publicstaticvoid main (string[] args) { = 100.0; = 100.0; = 200.0; = 200.0; = = D2) ; = = d4);} }
The result of the operation is:
false false
The reasons for this result are: Byte, short, Integer, Long, char the valueof () method of the boxed class is cached with a 128-bit dividing line, if it is below 128 and-128 is the value of the cache will be taken from the reference, In the case of integer, the source code for the valueof (int i) is:
Public Static Integer valueOf (int i) { finalint offset =N; if // return integercache.cache[i + offset]; } return New Integer (i); }
Float, double is not, the reason is also very simple, because Byte, short, Integer, long, char in a range of integer number is limited, but float, double these two floating-point numbers are not. Regarding this little knowledge point, the individual made two comments:
1, not important, in addition to interview to explore the level of knowledge of job seekers, not much use
2, the mind to have the concept of caching , caching for the program to improve the efficiency, save space is a great help
Java Syntax sugar 2: auto-boxing and automatic unpacking