计算题
Integer f1=100, f2=100, f3=150, f4=150;
System.out.println(f1 == f2);//Result-----true
System.out.println(f3 == f4);//Result-----false
Integer a = 1;
Integer b = 2;
Integer c = 3;
Integer d = 3;
Integer e = 321;
Integer f = 321;
Long g = 3L;
System.out.println(c == d);//Result---true
System.out.println(e == f);//Result---false
System.out.println(c == (a + b));//Result---true
System.out.println(c.equals(a + b));//Result---true
System.out.println(g == (a + b));//Result---true
System.out.println(g.equals(a + b));//Result---false
答案解析:
######因为这里的四个变量都是Integer对象引用,所以下面的==运算比较的不是值而是引用。因为这里用到了语法糖:装箱,而装箱的本质是当我们给一个Integer对象赋一个int值得时候,会调用Integer类的静态方法valueOf,而valueOf的源码是:public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
// range [-128, 127] must be interned (JLS7 5.1.7)
简而言之:如果整型字面量的值在-128到127之间,那么不会new新的Integer对象,而是直接引用常量池中的Integer对象,所以得到结果:Ture and false
不同数据类型之间如何计算?
当不同数据类型之间参与运算的时候,会把数据范围小的 转成数据范围大的类型。
注意:byte,short,char这三种数据类型参与运算的时候,会无条件先转成int再参与运算 String StringBuffer StringBuilder String:字符串常量,在修改时不会改变自身;若修改,等于重新生成新的字符串对象。 StringBuffer:在修改时会改变对象自身,每次操作都是对StringBuffer对象本身进行修改,不是生成新的对象;使用场景:对字符串经常改变情况下,主要方法:append(),insert()等。 String:对象定义后不可变,线程安全。 StringBuffer:是线程安全的(对调用方法加入同步锁),执行效率较慢,适用于多线程下操作字符串缓冲区大量数据, StingBuilder:是线程不安全的,适用于单线程下操作字符串缓冲区大量数据。 ` String s1 = “Programming”; String s2 = new String(“Programming”); String s3 = “Program”; String s4 = “ming”; String s5 = “Program” + “ming”; String s6 = s3 + s4; System.out.println(s1 == s2);//Result—false System.out.println(s1 == s5);//Result—true System.out.println(s1 == s6);//Result—false System.out.println(s1 == s6.intern());//Result—true System.out.println(s2 == s2.intern());//Result—false String str1=new StringBuilder(“计算机”).append(“软件”).toString(); System.out.println(str1.intern()==str1);//Result—true System.out.println(str1==str1.intern());//Result—true String str2= new StringBuilder(“ja”).append(“va”).toString(); System.out.println(str2.intern()==str2);//Result—false System.out.println(str2==str2.intern());//Result—false intern()在JDK1.7的实现不会再复制实例,只是在常量池中记录首次出现的实例引用,因此intern()返回的引用和由StringBuilder创建的那个字符串实例是同一个。对str2比较返回false是因为”java”这个字符串在执行StringBuilder.toString()之前已经出现过,字符串常量池中已经有它的引用了,不符合“首次出现”的原则,而“计算机软件”这个字符串是首次出现的,因此返回true a.直接赋值,也是一个对象,但是保存到常量池 String s = “abc”; b.无参构造: public String(); String s1 = new String();//保存到堆中 c.有参构造: public String(“其他字符串”); String s2 = new String(“abc”);//保存到堆区
`
######
如需参考文档请点击下载:参考文档

WeChat - 微信公众号