每日三道题(答案在下方)
说一说Java的Interface和abstract class 的区别? 说一说String与StringBuffer的区别? 什么场景下使用BigDecimal类型? | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
答案
区别1: 子类只能继承一个抽象类,不能继承多个 子类可以实现多个接口 区别2: 抽象类可以定义 public,protected,package,private 静态和非静态属性 final和非final属性 但是接口中声明的属性,只能是 public 静态 final的 即便没有显式的声明
注:他们包含如下共同点
①:interface和abstract class都不可以被实例化。
②:interface的实现类和abstract class的子类只有全部实现了接口或者抽象类中的方法后才可以被实例化。
String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变 的对象 。 每次对 String对象的值进行改变的时候其实都等同于生成了一个新的String 对象,然后将指针指向新的 String 对象.而 StringBuffer只会对对象 本身进行操作,而不是生成新的对象,再改变对象引用。
注:因此经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,那速度是一定会相当慢的。
在商业计算中要用java.math.BigDecimal类。 因为并不是所有的小数都可以用二进制浮点数精确表示。由于浮点数采用二进制系统表示,而二进制无法精确的表示1/10,好比十进制无法精确表示1/3一样。因此,对于很多值浮点数都是采用其能够表示的离目标值近的数来表示,这有可能会在计算中带来不易察觉的误差。为了解决基本数据类型浮点数不能进行精确计算的问题,Java中专门提供了java.math.BigDecimal类,其提供浮点数的精确计算功能。
例:double a = 0.02;
double b = 0.03;
b-a=0.009999999999999998
如果使用
BigDecimal b1 = new BigDecimal("0.03");
BigDecimal b2 = new BigDecimal("0.02");
b1.subtract(b2)得到0.01