提及源码其实第一个要看的应该是咱们的父类Object,这里就不对它进行描述了你们各自对其进行阅读便可(其中留意wait()方法可能会存在虚假唤醒的状况)。缓存
接下来介绍咱们的八种基本类型(这个你们都知道吧):char、byte、short、int、long、float、double、boolean。这里也不太描述其过多的东西,只说些要特别注意的事项(若是我这存在遗落的,欢迎你们补充):eclipse
先说共同点:ui
public boolean equals(Object obj) { if (obj instanceof Short) { return value == ((Short)obj).shortValue(); } return false; }
@Test public void testEquals(){ Short num1 = 1; Integer num2 = 1; Long num3 = 1L; System.out.println(num1.equals(num2));//false System.out.println(num2.equals(num3));//false }
@Test public void testByte(){ //byte的范围是-128~127,针对byte若是赋值不在范围eclipse会要求强制转型成byte. //封装类型Byte new Byte("128")当使用字符串建立实例时,其中值超过范围会报错NumberFormatException。 byte b1 = 12; Byte b2 = 12;//(byte)129;//超过范围要求强转 Byte b3 = 12;//(byte)129; //Byte b4 = new Byte("128");//抛出异常 Byte b4 = new Byte("12");//抛出异常 System.out.println(b1 == b2);//true System.out.println(b2 == b3);//true System.out.println(b2 == b4);//false }
@Test public void testShort(){ //一、short范围:-32768 ~ 32767 Short s = new Short("32767");//超过范围会报错 NumberFormatException s = new Short((short)327671);//超过这个范围自动转换 //二、装箱与拆箱 自动转型 short s1 = 12; Short s2 = new Short(s1);//手动装箱 System.out.println("s1 == s2:" + (s1 == s2));//自动拆箱 true //三、valueOf方法缓存了-128~127的范围,超过这个范围就要另外建立这个实例。 Short s3 = 12; Short s4 = 12; Short s5 = 128; Short s6 = 128; System.out.println("s3 == s4:" + (s3 == s4)); //true System.out.println("s5 == s6:" + (s5 == s6)); //false //四、因为上面这个特性,因此这种包装类型不能在循环遍历中赋值。否则其值超过这个范围的话,就会建立新的对象,若是不少的话,就会建立不少对象。浪费空间。 }
@Test public void testInteger(){ //一、Integer范围:-2147483648 ~ 2147483647 //后面与Short同样 //二、装箱与拆箱 自动转型 int s1 = 12; Integer s2 = new Integer(s1);//手动装箱 System.out.println("s1 == s2:" + (s1 == s2));//自动拆箱 true //三、valueOf方法缓存了-128~127的范围,超过这个范围就要另外建立这个实例。 Integer s3 = 12; Integer s4 = 12; Integer s5 = 128; Integer s6 = 128; System.out.println("s3 == s4:" + (s3 == s4));//true System.out.println("s5 == s6:" + (s5 == s6));//false //四、因为上面这个特性,因此这种包装类型不能在循环遍历中赋值。否则其值超过这个范围的话,就会建立新的对象,若是不少的话,就会建立不少对象。浪费空间。 }
@Test public void testLong(){ //范围就不考虑了。 //一样、valueOf方法缓存了-128~127的范围,超过这个范围就要另外建立这个实例。 Long s3 = 12L; Long s4 = 12L; Long s5 = 128L; Long s6 = 128L; System.out.println("s3 == s4:" + (s3 == s4));//true System.out.println("s5 == s6:" + (s5 == s6));//false //因为上面这个特性,因此这种包装类型不能在循环遍历中赋值。否则其值超过这个范围的话,就会建立新的对象,若是不少的话,就会建立不少对象。浪费空间。 }
@Test public void testFloat(){ //没有特殊要注意的,其余跟上面同样 int f = 1; Float f1 = 1F; Float f2 = new Float(f); System.out.println(f == f1);//true System.out.println(f1 == f2);//false //注意不要用这类型作加减运算,精度问题会影响。 System.out.println(f1 - 0.1f*9);//0.099999964 }
@Test public void testDouble(){ //注意不要用这类型作加减运算,精度问题会影响。 System.out. println(1.0 - 0.1*9);//0.09999999999999998 //valueof Double i1 = 100.0; Double i2 = 100.0; Double i3 = 200.0; Double i4 = 200.0; System.out.println(i1==i2);//false System.out.println(i3==i4);//false }
@Test public void testEquals(){ Short num1 = 1; Integer num2 = 1; Long num3 = 1L; System.out.println(num1.equals(num2));//false System.out.println(num2.equals(num3));//false }
猜猜下面各个输出的结果是什么:spa
@Test public void test1(){ Integer a = 1; Integer b = 2; Integer c = 3; Integer d = 3; Integer e = 321; Integer f = 321; Long g = 3L; Long h = 2L; System.out.println(c==d); System.out.println(e==f); System.out.println(c==(a+b)); System.out.println(c.equals(a+b)); System.out.println(g==(a+b)); System.out.println(g.equals(a+b)); System.out.println(g.equals(a+h)); }
其中会涉及到拆箱与装箱(自行弄懂)的问题。针对个别解析以下:3d
c==(a+b) :a+b都会拆箱成int而后相加,因此c也会自动拆箱比较。code
g==(a+b):同理,a+b都会拆箱成int而后相加,g会拆箱成long类型。因此基本类型比较只要比较其值便可。orm
g.equals(a+b):先拆箱a+b再装箱仍是Integer,这里不会自动转型。Long类型的equals判断不是同一类型直接返回false对象
g.equals(a+h):同上,先拆箱a+h再装箱(这里会自动向上转型)为Long,因此同类型的比较值又相等,这里返回true.blog
最终结果以下:ip
true false true true true false true