This article is participating in “Java Theme Month – Java Debug Notes Event”, see < Event link > for more details.
preface
- Integer as a wrapper class. You know he passed
= =
What would that look like? - Tends to be used in official designs
Integer.compareTo
To do twoInteger
To compare content rather than use it= =
Problem description
- Build 128 into two Integer objects. Do you think they are the same
- Build 127 into two Integer objects. Do you think they are the same
public static void main(String[] args) throws InterruptedException {
Integer i1=128;
Integer i2=128;
Integer i3=127;
Integer i4=127;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
Copy the code
Problem analysis
- The final output of the above program is respectively
false
,true
- Why does the same operation get different results? I really don’t see any difference except the value difference
- Right! It’s a question of value. Because different values lead to different results.
IntegerCache
- Such a class exists within Integer
IntegerCache
His role is to guideInteger
The data is cached.
- Let’s take a look at his source code for an explanation of this class. He will be
Integer
Data of -128 to 127 is cached. - In other words, data outside this range is considered cold data. No caching. The cache here is equal to
String
Do the same for constant pools. - So the top
Integer i1=128; Integer i2=128
. It’s actually two objects in the heap. Because 128 is out of range and I don’t swap out - while
Integer i3=127; Integer i4=127
It’s in cache so both variables point to the same block of address. - This explains why one is false and one is true.
conclusion
- Why do you do this in Java?
- A: This is definitely designed to save memory. The inclusion of the cache prevents data in this range from being created repeatedly in the heap
- It can be passed after java6
XX:AutoBoxCacheMax=num
To set theIntegerCache
The upper limit of the interval. Integer i =100
Will automatically box 100 intoInteger
Object is calledInteger.valueOf
Methods.
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Copy the code
-
This is the boxing operation in the Integer class. IntegerCache implements the scope of the subject content cache for this article.
-
Unpacking: Automatic unpacking is the conversion of the package type to the basic data type. The automatic unboxing calls integer.intValue (),
-
Boxing: Automatic boxing is the conversion of the base data type to the packaging type. The automatic boxing procedure calls integer.valueof (int), which is fetched from the Integer constant pool when int is in the range -128 to 127, and produces an Integer object through new when int is outside the range. Easy to cause OOM