基本数据类型封装类比较 Java源码解读(一) 8种基本类型对应的封装类型

写在前面的话

    最近作项目时,遇到一个小bug,做为这么长时间的程序员,这么基础的东西如今才搞懂,惭愧~ 在此mark下,但愿之后不要再犯html

问题:

Long long1=127L;
Long long2 = 127L;

System.out.println(long1==long2);//true
System.out.println(long1.equals(long2));//true


Long long1=128L;
Long long2 = 128L;

System.out.println(long1==long2);//false
System.out.println(long1.equals(long2));//true
    

  一样是封装类型使用==比较,为啥<=127能够,>128就不能够呢?java

问题分析:

1.二者比较数值时使用封装类的valueOf方法,而该方法缓存了-128~127的数值,超过这个数值的话,都会建立新的封装对象,两个对象用==相比的话,返回的确定是false。如下为Long类型的valueOf源码程序员

public static Long valueOf(long l) {
        final int offset = 128;
        if (l >= -128 && l <= 127) { // will cache
            return LongCache.cache[(int)l + offset];
        }
        return new Long(l);
}

  

2.哪几种类型的valueOf方法都缓存了值呢? 如下五种都缓存了数值缓存

类型 缓存范围 数值范围
Character       0~127 0~65535
Byte  -128~127 -128~127
Short  -128~127 -32768 ~ 32767
Integer  -128~127 -2147483648 ~ 2147483647
Long  -128~127 -9223372036854775808 ~ 9223372036854775807

 

 

 

 

 

 

 

 

 

3.Float和Double类型是否缓存值呢?如下是Float的valueOf源码post

public static Float valueOf(float f) {
        return new Float(f);
}

  能够看出没有缓存数值,因此不能直接使用==来比较url

 

4.一些其余关于基本类型和封装类的特性,请参考如下博客地址spa

Java源码解读(一) 8种基本类型对应的封装类型htm

 

总结:

1.若是比较的两个数值都是基本类型的封装类,建议直接使用equals方法。对象

相关文章
相关标签/搜索