zoukankan      html  css  js  c++  java
  • 基本数据类型封装类比较

    写在前面的话

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

    问题:

    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就不可以呢?

    问题分析:

    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源码

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

      可以看出没有缓存数值,所以不能直接使用==来比较

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

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

     

    总结:

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

  • 相关阅读:
    浅谈模块化开发
    用gulp搭建并发布自己的cli脚手架
    取值运算符新用法
    vue双向绑定之简易版
    获取对象属性之括号方式
    前端格式化工具之Prettier
    git操作之摘樱桃
    Sort
    MongoDB
    项目使用本地的包
  • 原文地址:https://www.cnblogs.com/xiaozhijing/p/10968715.html
Copyright © 2011-2022 走看看