本文共 5602 字,大约阅读时间需要 18 分钟。
一.相关概念
二.8种基本类型的包装类和常量池
Integer i1 = 40; Integer i2 = 40; System.out.println(i1==i2);//输出TRUE
这5种包装类默认创建了数值[-128,127]的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。
//Integer 缓存代码 :public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
Integer i1 = 400; Integer i2 = 400; System.out.println(i1==i2);//输出false
Double i1=1.2; Double i2=1.2; System.out.println(i1==i2);//输出false
Integer i1 = 40; Integer i2 = new Integer(40); System.out.println(i1==i2);//输出false
Integer i1 = 40; Integer i2 = 40; Integer i3 = 0; Integer i4 = new Integer(40); Integer i5 = new Integer(40); Integer i6 = new Integer(0); System.out.println("i1=i2 " + (i1 == i2)); System.out.println("i1=i2+i3 " + (i1 == i2 + i3)); System.out.println("i1=i4 " + (i1 == i4)); System.out.println("i4=i5 " + (i4 == i5)); System.out.println("i4=i5+i6 " + (i4 == i5 + i6)); System.out.println("40=i5+i6 " + (40 == i5 + i6));
i1=i2 truei1=i2+i3 truei1=i4 falsei4=i5 falsei4=i5+i6 true40=i5+i6 true
解释:语句i4 == i5 + i6,因为+这个操作符不适用于Integer对象,首先i5和i6进行自动拆箱操作,进行数值相加,即i4 == 40。然后Integer对象无法与数值进行直接比较,所以i4自动拆箱转为int值40,最终这条语句转为40 == 40进行数值比较。 Java中的自动装箱与拆箱
三.String类和常量池
String str1 = "abcd"; String str2 = new String("abcd"); System.out.println(str1==str2);//false
这两种不同的创建方法是有差别的,第一种方式是在常量池中拿对象,第二种方式是直接在堆内存空间创建一个新的对象。 只要使用new方法,便需要创建新的对象。
String str1 = "str"; String str2 = "ing"; String str3 = "str" + "ing"; String str4 = str1 + str2; System.out.println(str3 == str4);//false String str5 = "string"; System.out.println(str3 == str5);//true
java基础:字符串的拼接
public static final String A = "ab"; // 常量Apublic static final String B = "cd"; // 常量Bpublic static void main(String[] args) { String s = A + B; // 将两个常量用+连接对s进行初始化 String t = "abcd"; if (s == t) { System.out.println("s等于t,它们是同一个对象"); } else { System.out.println("s不等于t,它们不是同一个对象"); } } s等于t,它们是同一个对象
A和B都是常量,值是固定的,因此s的值也是固定的,它在类被编译时就已经确定了。也就是说:String s=A+B; 等同于:String s="ab"+"cd";
public static final String A; // 常量Apublic static final String B; // 常量Bstatic { A = "ab"; B = "cd"; } public static void main(String[] args) { // 将两个常量用+连接对s进行初始化 String s = A + B; String t = "abcd"; if (s == t) { System.out.println("s等于t,它们是同一个对象"); } else { System.out.println("s不等于t,它们不是同一个对象"); } } s不等于t,它们不是同一个对象
A和B虽然被定义为常量,但是它们都没有马上被赋值。在运算出s的值之前,他们何时被赋值,以及被赋予什么样的值,都是个变数。因此A和B在被赋值之前,性质类似于一个变量。那么s就不能在编译期被确定,而只能在运行时被创建了。
public static void main(String[] args) { String s1 = new String("计算机"); String s2 = s1.intern(); String s3 = "计算机"; System.out.println("s1 == s2? " + (s1 == s2)); System.out.println("s3 == s2? " + (s3 == s2)); }
s1 == s2? falses3 == s2? true
public class Test { public static void main(String[] args) { String hello = "Hello", lo = "lo"; System.out.println((hello == "Hello") + " "); System.out.println((Other.hello == hello) + " "); System.out.println((other.Other.hello == hello) + " "); System.out.println((hello == ("Hel"+"lo")) + " "); System.out.println((hello == ("Hel"+lo)) + " "); System.out.println(hello == ("Hel"+lo).intern()); } }class Other { static String hello = "Hello"; }package other;public class Other { public static String hello = "Hello"; }
true true true true false true```在同包同类下,引用自同一String对象.在同包不同类下,引用自同一String对象.在不同包不同类下,依然引用自同一String对象.在编译成.class时能够识别为同一字符串的,自动优化成常量,引用自同一String对象.在运行时创建的字符串具有独立的内存地址,所以不引用自同一String对象.-----
转载地址:http://cjgii.baihongyu.com/