2022.8.8
一、常用API,System、BigDecimal
API即应用程序编程接口application programming interface,由java写好的类和方法,提供给编程者直接使用
System类,其内部的成员方法和成员变量都是static静态的,构造方法是私有的不能实例化,作为工具类,成员变量包含in、out、err,分别代表标准输入流(键盘输入)、标准输出流(显示器)、标准错误输出流(显示器)。除了平时使用过的out.println()之外,还有:
exit(),即中止当前的虚拟机,传入参数为0即正常中止。
currentTimeMillis(),即获取当前时间毫秒值。
arrayCopy(),数组扩容方法,将当前数组,整个复制到新的数组上,后面会用到。
BigDecimal类,用来保证数字不丢失精度,类的构造方法,支持传入double和String类型,来构造成BigDecimal类型对象,且BigDecimal重写了toString方法,可以直接打印。其中,建议使用String类型进行传参,避免double本身带来的精度问题,BigDecimal有如下方法:
b1.add(b2),相加;b1.subtract(b2),相减;b1.multiply(b2),相乘;b1.divide(b2),相除;以上都是两个BigDecimal对象之间的操作。
其中b1.divide(b2),相除可能会遇到除不尽需要四舍五入的情况,则:b1.divide(b2,2,RoundingMode.HALF_UP);即b1/b2,保留2位小数,使用四舍五入模式
二、包装类,装箱和拆箱
由于基本数据类型不具备面向对象的特性,所以需要包装类型,继承Object,使得原本的基本数据类型,可以执行方法操作,例如Integer的默认值是null,而int的默认值是0,用Integer可以判断对应属性是否有数值isNull();。
手动装箱:例如:
基本数据类型int转换成对应的包装类型Integer:Integer.valueOf(10);其他包装类也有类似方法将基本数据类型转换成对应类型。而String.valueOf(Object obj),则是将Object类型也就是任何类型转换成String类型。
String类型转换成int:Integer.parseInt("10");其他包装类也有类似方法将String转换成基本数据类型。
String类型转换成Integer则:Integer.valueOf(Integer.parseInt("10"));
手动拆箱:包装类型转换成对应的基本数据类型:Integer a=10;System.out.println(a.intValue());
手动装拆箱则:Integer s1 = 2;int s2 = s1,或者在形参、返回值上进行装拆
Integer i = 1; //自动拆箱//Integer i = Integer.valueOf(1);
i += 1; //自动装箱//i = Integer.valueOf(i.intValue() + 1);
System.out.println("i:" + i)//System.out.println((new StringBuilder("i:")).append(i).toString());
Integer中:
#Integer s1 = 2;Integer s2 = 2;System.out.println(s1 == s2);
#答案为true;
#Integer s1 = new Integer(2);Integer s2 = new Integer(2);System.out.println(s1 == s2);
#答案为false
自动装箱等效于Integer.valueOf(),在valueOf()的方法中会缓存-127到128的Integer对象。
因此,在valueOf()方法中,如果值在-127-128之间,都会直接返回缓存中的该对象而不会重新生成对象,引用地址当然相同了。
而new Integer()的话并没有进行缓存,而且直接创建对象放入堆中,然后令栈中的2个变量引用它们,那么比较这两个变量也就是比较2个对象的内存地址当然会返回false。
使用缓存机制的原因是:因为我们常见的基本数据类型中,使用包装类包装数值时会创建大量对象,如果没有缓存的话,会有大量的包装类被创建,占用内存,降低效率。选择最常用的数值范围设置缓存机制,就可以优化这一现象。