1、基本类型与包装类型、引用类型
2、byte和int相互转换
// int转byte
byte b = (byte)aInt; // 取int最后一个字节,如果int值大于255,则转换不准确
// 通过inputStream.read()获取的值可以通过此方法转换
// byte转int
int I = (int)aByte; //如果要求值不变,想要进行数值计算,可采用此方式转换
3、高精度数据转换
// float和double只能用于科学计算,Double.valueOf(String) and Float.valueOf(String)都会丢失精度
// 在商业计算中应该使用java.math.BigDecimal
// 注意:BidDecimal使用String进行初始化
String d2 = “0.2”; // 注意,使用String初始化BigDecimal
BigDecimal bd1 = new BigDecimal(d2);
BigDecimal bdDivideTest2 = bd3.divide(bd4,2,BigDecimal.ROUND_CEILING);// 可能产生无限循环小数,需要截取小数
// 高精度计算
String d1 = "0.1";
String d2 = "0.2"; // 注意,使用String初始化BigDecimal
BigDecimal bd1 = new BigDecimal(d1);
BigDecimal bd2 = new BigDecimal(d2);
BigDecimal bdAdd = bd1.add(bd2);
System.out.println(bdAdd.toString());
BigDecimal bdSub = bd2.subtract(bd1);
System.out.println(bdSub.toString());
BigDecimal bdMulti = bd2.multiply(bd1);
System.out.println(bdMulti.toString());
BigDecimal bdDivide = bd2.divide(bd1); // 可能产生无限循环小数,抛出异常:java.lang.ArithmeticException: Non-terminating decimal expansion
// 例如
String d3 = "0.12";
String d4 = "0.56";
BigDecimal bd3 = new BigDecimal(d3);
BigDecimal bd4 = new BigDecimal(d4);
// BigDecimal bdDivideTest1 = bd3.divide(bd4); // 产生了无限循环小数
BigDecimal bdDivideTest2 = bd3.divide(bd4,2,BigDecimal.ROUND_CEILING); // 解决方法,主动截取小数位数
// 如何保留两位小数
double d5 = 11.32542;
BigDecimal bd5 = new BigDecimal(Double.toString(d5));
double d6 = bd5.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue(); //保留2位小数
System.out.println("保留2位小数:" + d6);
4、拆箱与装箱
(1) 当封装类与基础类型进行==运算,封装类会自动拆箱,并将拆箱结果与基础类型比较;而两个封装类进行==运行时,与其它的对象进行==运行一样,对比两个对象的地址
(2) 如果一个方法中参数类型为原始数据类型,所传入的参数类型为其封装类,则会自动对其进行拆箱;相应,如果一个方法中参数类型为封装类型,所传入的参数类型为其原始数据类型,则会自动对其进行装箱
Integer i = 100; // 自动装箱
Integer j = new Integer(100); // 强制在堆中新建对象
int w = 100;
System.out.println(w == i); // 结果为true,说明:==用于比较引用,从结果来看是自动拆箱(Integer.intValue)后进行比较,如果是自动装箱后比较则结果应该为false
System.out.println(w == j); // 结果为true,说明:同理
System.out.println(i == j); // 结果为false
System.out.println(i.equals(w)); // 结果为true,说明:equals接收Object作为参数,说明w被自动装箱了,但是equals内部使用了Integer.intValue进行数值比较,所以返回true
(3) Integer缓存
Integer t1 = 100;
Integer t2 = 100;
Integer t3 = 254;
Integer t4 = 254;
Integer t5 = 300;
Integer t6 = 300;
System.out.println(t1 == t2); // 结果为true,t1和t2指向了同一个对象,说明使用了Integer缓存(-128-127),用于提高性能
System.out.println(t3 == t4); // 结果为false
System.out.println(t5 == t6); // 结果为false
需要注意的问题:
(1)int与Integer比较
Integer t7 = null;
int i = 100;
System.out.println(t7 ==i); // 会抛出NullPointerException,原因是自动拆箱使用了Integer.intValue()
(2)Integer作为类变量
Integer作为类变量时(Integer num1;),属于引用类型变量,默认初始化为null
因此如果调用person.getNum1() + 1;同样会触发自动拆箱导致空指针异常
解决办法是在类构造函数中,给num1初始化