不积跬步,无以至千里;
不积小流,无以成江海。
——荀子《劝学篇》
用偶判断,不用奇判断。(i%2 == 0 ? “偶数” : “奇数” )
对于基础知识,我们应该“知其然,并知其所以然”。
在计算机中浮点数有可能是不准确的,它只能无限接近准确值,而不能完全精确。在十进制的世界里没有办法准确表示1/3,而在二进制世界里当然也无法准确表示1/5,在二进制的世界里1/5是一个无限循环小数。
要解决精度问题,有两种办法:
1、使用BigDecimal
BigDecimal是专门为弥补浮点数无法精确计算的遗憾而设计的类,并且本身提供了加减乘除常用数学算法。可以和数据库Decimal类型的字段映射时,是最优选择。
2、使用整型
把参与运算的值扩大100倍,并转变为整型,然后在展示时再缩小100倍。
Java是先运算然后再进行类型转换。过了界就会从头开始。
基本类型转换时,使用主动声明方式减少不必要的Bug。如:long dis = 1L * 60 * 8;
数字越界使检验条件失效。
BigDecimal和RoundingMode是一个绝配,目前Java支持七种舍入方式:
1、ROUND_UP:远离零方向舍入
2、ROUND_DOWN:趋向零方向舍入
3、ROUND_CEILING:向正无穷方向舍入 Math.round方法使用的即为此模式
4、ROUND_FLOOR:向负无穷方向舍入
5、HALF_UP:最近数字舍入(5进)
6、HALF_DAWN:最近数字舍入(5舍)
7、HALF_EVEN:银行家算法:四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。
根据不同的场景,慎重选择不同的舍入模式,以提高项目的精准度,减少算法损失。
包装对象和拆箱对象可以自由转换,但是要剔除null值,null值并不能转化为基本类型。包装类型参与运算时,要做null值校验。
在Java中“==”是用来判断两个操作数是否有相等关系的,如果是基本类型则判断值是否相等,如果是对象则判断是否是一个对象的两个引用,也就是地址是否相等。
在Java中,“>”和“<”用来判断两个数字类型的大小关系,注意只能是数字型的判断,对于Integer包装类型,是根据其intValue()方法的返回值进行比较的。
通过valueOf产生的包装对象时,如果int参数在-128到127之间,则直接从整型池中获得对象,不在该范围的int类型则通过new生成包装对象。
通过包装类的valueOf生成包装实例可以显著提高空间和时间性能。
自动拆箱(装箱)只有在赋值时才会发生,和重载没有关系。
自动装箱有一个重要的原则:基本类型可以先加宽,再转变成宽类型的包装类型,但不能直接转变成宽类型的包装类型。简单地说就是,int可以加宽转变成long,然后再转变成Long对象,但不能直接转变成包装类型,这里指的都是自动转换。
重申,基本类型优先考虑。
在Java中,随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:
1、种子不同,产生不同的随机数。
2、种子相同,即使实例不同也产生相同的随机数。
若非必要,不要设置随机数种子。