1、介绍Java语言提供了8种基本数据类型。分别是 byte、short、int、long、float、double、boolean、char。 8种基本数据按类型分可以分为 基本数据类型 "==" 比较都是值。 2、拆箱和装箱问题Integer total = 99;
//执行上面那句代码的时候,系统为我们执行了,即自动装箱
Integer total = Integer.valueOf(99);
int totalprim = total;
//执行上面那句代码的时候,系统为我们执行了,即自动拆箱
int totalprim = total.intValue();
Integer i = 400;
Integer j = 400;
System.out.println(i==j); //false
Integer o = 12;
Integer k = 12;
System.out.println(o==12); //true
上面提到,使用 Integer去创建数据,其实是一个Integer.valueOf 过程,Integer.valueOf 源码如下: public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
如果值的范围在-128到127之间,它就从高速缓存返回实例。
否则 new 一个Integer对象。new Integer 就是一个装箱的过程了,装箱的过程会创建对应的对象,这个会消耗内存,所以装箱的过程会增加内存的消耗,影响性能。所以说最后是i 和 j 两个对象比较,内存地址不一样,结果就是false了。 int a =200;
Integer b = new Integer(200);
Integer c = 200;
System.out.println(a==b); //true
System.out.println(a==c); //true
System.out.println(b==c); //false
这也是面试经常问到的,在代码中我们经常也会用到这种判断。 a==b,a==c,只要和基本数据类型(即 int)比较,Integer就会调用value.intValue()拆箱成基本数据类型,你也可以理解为:当有基本数据类型,只比较值 b==c,这两个是永远不会相等的,拆箱装箱只是针对基本数据类型的比较才有,Integer并不是基本数据类型,b、c两者存放的内存地址不一样,所以不相等。 总结: ①、无论如何,Integer与new Integer不会相等。不会经历拆箱过程,因为它们存放内存的位置不一样。 ②、两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。 ③、两个都是new出来的,即两个new Integer比较,则为false。 ④、int与Integer、new Integer()进行==比较时,结果永远为true,因为会把Integer自动拆箱为int,其实就是相当于两个int类型比较。 3、int 和 Integer4、默认值问题Java中: 浮点数如果不加f,默认就是double类型的,前面再用 float修饰,就会报错。可以使用两种方法解决:5、Integer.parseInt()和Integer.valueOf()
public static int parseInt(String s) throws NumberFormatException
将字符串参数作为带符号十进制整数来转换。如果无法转换,抛出 NumberFormatException。 public static Integer valueOf(String s) throws NumberFormatException
返回初始化为指定 String 值的新的 Integer 对象,如果无法转换,抛出 NumberFormatException。 String str = "-12";
int num = Integer.parseInt(str);
System.out.println(num); // -12
Integer num2 = Integer.valueOf(str);
System.out.println(num2); // -12
int num3 =Integer.parseInt("HaC"); //java.lang.NumberFormatException
int 与 Integer转换: int a=A.intValue();
Integer A=Integer.valueOf(a);
Integer派别:Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。
Double派别:Double、Float的valueOf方法的实现是类似的。每次都返回不同的对象。 6、精度丢失问题byte a = 5;
int b =2;
float c = 6f;
double d =0.03;
double d2 =300.03;
System.out.println(a/b); // 2 a会转化为int 类型
System.out.println(b/c); // 0.33333334 b会转化为float类型
System.out.println(a+d+d2); // 301.05999999999995 a会转化为double类型,但是结果理应是 301.06
不同类型的数据在运算的时候,会向高精度的数据类型转换。 其实double类型数值的计算经常会出现这种精度丢失的问题,尤其是有小数点的情况下,常常会因为精度丢失而导致程序出错。因为计算机是通过二进制进行运算的,而计算机在表示小数的二进制是会有精度问题的。 所以我们在运算高精度的数据的时候,可以使用 java.math.BigDecimal 类 7、字符串与整数拼接问题String a = "1";
int b = 1;
int c = 2;
System.out.println(a + b + c); //112
System.out.println(b + c + a); //31
a + b + c 从左到右按顺序运算,a+b 的结果是 12 ,是一个String,然后再拼接 c,最后是 String b + c + a 从左到右按顺序运算,b + c 的结果是 3,是一个int ,然后拼接a,变成 String。 8、看下面的问题
1)表达式(short)10/10.2*2运算后结果是什么类型?
答案是double。要注意是(short)10/10.2*2,而不是(short) (10/10.2 *2),前者只是把10强转为short,又由于式子中存在浮点数,所以会对结果值进行一个自动类型的提升,浮点数默认为double,所以答案是double;后者是把计算完之后值强转short。
|