千锤百炼之java基础整型运算优化

通过以下几个例子可以正确理解整数运算优化,也是常见的面试题

public class HappyOper1{
    public static void main(String[] args){
        short s = 1+1;                        
    }
}


public class HappyOper2{
    public static void main(String[] args){
        short s = 1;
        s = s+1;                    
    }
}

public class HappyOper3{
    public static void main(String[] args){
        short s = 1;
        s +=1;                    
    }
}

1、赋值运算符

public class HappyOper1{
    public static void main(String[] args){
        short s = 1+1;                        
    }
}

根据规范https://docs.oracle.com/javase/specs/jls/se9/html/jls-5.html#jls-5.2 说明:

A narrowing primitive conversion may be used if the variable is of type byte, short, or char, and the value of the constant expression is representable in the type of the variable.
即常量的表达式 可以复制给 byte short char。 这就是自动窄化,不用强制转换。

short s = 1+1;        

按道理是1+1为整数,但是 是常量的表达式,自动窄化,根据java基础整型存储奥秘的理解,编译后结果肯定已经为:

int s=2;

2、算数运算符

public class HappyOper2{
    public static void main(String[] args){
        short s = 1;
        s = s+1;                    
    }
}

无法进行编译,左边有变量参与,编译器在无法分析出该变量的值是什么,因为s为变量,其值不确定无法确定s+1是否超出short范围,为了防止进行类型转换时丢失精度,所以编译器直接当成无法确定来处理。

3、扩展运算符

操作运算符存在扩展运算符

public class HappyOper3{
    public static void main(String[] args){
        short s = 1;
        s +=1;                    
    }
}

扩展运算符有两个作用,一是简化 s=s+1; 二是优化,内部存在类型转换,在规范中也有详细的说明。

扩展

总结

本文通过三个简单例子,结合官方规范来理解运算符优化,记住一点:我们用的是别人设计的语言,它怎么设计我们怎么去用,没办法,这就是规则,没必要深究,假设这些规则有bug,有错误,我们只能默默承受,等待它升级。。。。想成为指定规则的人,就努力把自己打造成牛逼的人。