public static Integer valueOf(int i) { //high为127 if(i >= -128 && i <= IntegerCache.high) return IntegerCache.***[i + 128]; else return new Integer(i); }
public class Test03 { public static void main(String[] args) { Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150; System. out.println( f1 == f2); //true System. out.println( f3 == f4); //false } }
当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法valueOf。
Integer f1 = Integer.valueOf(100);
Integer f2 = Integer.valueOf(100);
Integer f3 = Integer.valueOf(150);
Integer f4 = Integer.valueOf(150);
思考:那么Integer.valueOf()返回的Integer是不是是重新new Integer(num);来创建的呢?如果是这样的话,那么== 比较返回都是false,因为他们引用的堆地址不一样。
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.***[i + (-IntegerCache.low)]; return new Integer(i); }
*** = new Integer[(high - low) + 1]; int j = low; for( int k = 0; k < ***.length ; k ++) ***[k] = ***[k] = new Integer(j ++);
关于字符串的解释(摘自:https://www.cnblogs.com/huajiezh/p/6565301.html):String str1=”java”; //指向字符串池
String str2=”blog”; //指向字符串池
String s=str1+str2; //s是指向堆中值为"javablog"的对象,+运算符会在堆中建立来两个String对象,这两个对象的值分别是"java" "blog". 也就是说从字符串池中复制这两个值,然后在堆中创建两个对象,然后再建立对象s,然后将"javablog"的堆地址赋给s. 这句共创建了?个String 对象!
System.out.println(s==”javablog”); //结果是false。
Jvm确实对型如String str1=”java”;的String对象放在常量池里,但是它是在编译时那么做的,而String s=str1+str2;是在运行时刻才能知道,也就是说str1+str2是在堆里创建的,所以结果为false了