改善Java代码质量---数据类型

   

在Java当中有8种基本数据类型,分别是byte,char,short,int,long,float,double,boolean还有其对应的封装类型Byte,Character,Short,Integer,Long,Float,Double,Boolean,那我们究竟对他们有多少的了解呢? 

 

1.用偶判断,不用奇判断 

    在Java中可以使用取余的方式来进行奇数还是偶数的判断:

public static void main(String[] args) {  
        int num = -1;  
        System.out.println(num % 2 == 1 ? "奇数" : "偶数"); // 输出结果为偶数  
    }  

    从上面代码中,-1怎么可能是偶数呢?首先我们就需要了解Java是如何取余的 :

public static int remainder(int dividend, int divisor) {  
        return dividend - dividend / divisor * divisor;  
        //java中整数除以整数还是整数。
    }  

    -1 % 2的运算结果还是-1,以后记得写成num % 2 == 0 

 

2.对精确货币计算使用BigDecimal类型 

      在使用货币计算时,我们首先想到的是使用double类型,但在计算机世界中,浮点类型有可能是不准确的,他只能无限的接近某一个值,而不会完全精准,这是因为二进制的原因,就像用10进制无办法表示10 / 3一样,所以对于精确的货币计算,应该使用BigDecimal类型,而且BigDecimal和数据库中的NUMBER和DECIMAL类型很好的匹配。

 

3.注意类型的默认转换 

     在Java当中,当大的类型与小类型进行运算时,该运算会自动提升为大类型,这种转换成为加宽类型,例如long类型和int类型进行运算后会自动提升为long类型

public static void main(String[] args) {  
        // 2147483647为int最大值  
        long num = 2147483647 + 1;  
        System.out.println(num); // 运行结果为 -2147483648  
    }  

    以上代码中,2147483647为int类型的最大值,我使用long类型来接受int最大值+1应该是没问题的,但事实并不是如此,这是因为在Java中是先运算再进行类型转换的,二者都是int类型,所以运算结果也应该是int类型,所以超出了int类型的最大范围,此时应修改为2147483647L + 1

 

4.数值类型最大值应使用Java提供常量 

 

      在3的例子当中,我们使用了int的最大值214748364,当然读者可能是有超人的记忆把int的最大值和最小值记住了,但short类型long类型呢,所以我们应该使用Java自带的常量来获取数值类型的最大值和最小值

public static void main(String[] args) {  
        // int类型最大值  
        int maxInt = Integer.MAX_VALUE;  
        // int类型最小值  
        int minInt = Integer.MIN_VALUE;  
        // long类型最大值  
        long maxLong = Long.MAX_VALUE;  
        // long类型最小值  
        long minLong = Long.MIN_VALUE;  
        // short类型最大值  
        short maxShort = Short.MAX_VALUE;  
        // short类型最小值  
        short minShort = Short.MIN_VALUE;  
    }  

 

 5.注意数值的边界判断 

 

    public static void main(String[] args) {  
        test(Integer.MAX_VALUE + 1);  
    }  
    public static void test(int num) {  
        if (num < 2000) {  
            System.out.println("执行");  
        }  
    }  

 

    test方法的逻辑非常简单,若然int类型的数值少于2000就执行,当我使用int类型的最大值+1时,就因为类型越界而变成int的最少值,所以满足少于2000的条件从而执行方法,所以对于严谨的程序,应该进行 业务/正最大/负最小 的边界判断,特别是从前台接受过来的值。

 

6.提防包装类的null值 

    包装类型是基本类型的包装类,当使用包装类型时,其实就生成了对象,当然对象是允许为null的,所以需要注意包装类型的!null判断。

 

7.理解基本类型-->包装类型装箱拆箱过程 

    以下为Intger类型例子,Double和Float等同理:

    从基本类型-->包装类型是调用包装类型的valueOf()方法来进行转换 

    从包装类型-->基本类型是调用包装类型的intValue()方法来进行转换 

 

8.优先选择基本类型 

    基本类型是存在栈的,而包装类型因为是对象,所以是存在堆中,在处理速度上,由于基本类型是原生类型,所以速度更快。其实换个思维也可以思考到,包装类型封装了属性和方法,生成的速度会比基本类型慢,而且当包装类型进行运算时,都将调用intValue()方法然后再调用valueOf()方法封装回包装类型,所以在可行的情况下,优先选择基本类型,但在特定的框架例如Hibernate中推荐使用包装类型。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值