zoukankan      html  css  js  c++  java
  • Java 基础

    Autoboxing and Unboxing 总结

    关于equals 比较

     记住:equals方法比较的是真正的值

    • 两个包装类比较,比较的是包装的基本数据类型的值
    • 基本数据类型和包装类型比较时会先把基本数据类型包装后再比较 (但是因为equal比较的还是真正的值,因此最终结果没有影响)
    double i0 = 0.1;
    Double i1 = new Double(0.1);
    Double i2 = new Double(0.1);
    System.out.println(i1.equals(i2)); //true 2个包装类比较,比较的是包装的基本数据类型的值
    System.out.println(i1.equals(i0)); //true 基本数据类型和包装类型比较时,会先把基本数据类型包装后再比较
    
    • 源码
        public boolean equals(Object obj) {
            return (obj instanceof Double)
                   && (doubleToLongBits(((Double)obj).value) ==
                          doubleToLongBits(value));
        }
    

      

    关于==(双等号)比较

     记住:对于基本数据类型,==(双等号)比较的是值;而对于包装类型,==(双等号)比较的则是2个对象的内存地址。
    • 包装类new出来的都是新的对象, ==一定不相等
    • 基本数据类型和包装类比较会先把包装类拆箱(和equals是反的)
    double i0 = 0.1;
    Double i1 = new Double(0.1);
    Double i2 = new Double(0.1);
    System.out.println(i1 == i2);    //false new出来的都是新的对象
    System.out.println(i1 == i0);    //true 基本数据类型和包装类比较,会先把包装类拆箱
    
    • valueOf()内部也是用的new方法来构造对象的. 2个new出来的对象,内存地址肯定是不一样的。
    Double i1 = Double.valueOf(0.1);
    Double i2 = Double.valueOf(0.1);
    System.out.println(i1 == i2); //false valueOf方法内部实际上也是new
    
    • valueOf() 源码
    public static Double valueOf(String s) throws NumberFormatException {
            return new Double(parseDouble(s));
        }
    

      

    valueOf() 有缓存,new 没有缓存

    包装类型的缓存范围为:

    1. Integer类型有缓存-128-127的对象。只有该缓存的上限可以通过配置jvm更改
    2. Byte,Short,Long类型有缓存(-128-127)
    3. Character缓存0-127
    4. Boolean缓存TRUE、FALSE
    System.out.println(Integer.valueOf(1) ==Integer.valueOf(1)); //true --> valueOf() 有缓存,相当于是一个对象
    System.out.println(Integer.valueOf(999) ==Integer.valueOf(999)); //false 

    System.out.println(Integer.valueOf(1) == new Integer(1); //false --> new 没有缓存,相当于是两个不同的对象

      

    自动装箱,使用的是valueOf()的方法

    Integer i4 = Integer.valueOf(1);
    Integer i5 =1; --> 自动装箱用valueOf()
    System.out.println(i4 == i5); //true --> 因为自动装箱用valueOf(),并且 1 在 valueOf()有缓存范围,相当于是一个对象

    //--------------------
    Integer i7 = Integer.valueOf(999); 
    Integer i8 = 999; --> 自动装箱用valueOf()

    System.out.println(i7 == i8); //false --> 因为自动装箱用valueOf(),但是 999 不在 valueOf()有缓存范围,相当于是两个对象

      

    手动/自动拆箱 & 手动/自动装箱

    基本类型和对应的包装类可以相互装换:

    • 由基本类型向对应的包装类转换称为装箱,例如把 int 包装成 Integer 类的对象:
    Integer i = Integer.valueOf(1); //手动装箱
    Integer j = 1; //自动装箱 -- 实际使用valueOf()方法,new一个新的对象
    • 包装类向对应的基本类型转换称为拆箱,例如把 Integer 类的对象重新简化为 int。
    Integer i0 = new Integer(1);
    int i1 = i0; //自动拆箱
    int i2 = i0.intValue(); //手动拆箱

    jdk5.0开始增加自动装箱/拆箱

  • 相关阅读:
    sqlserver 自学笔记 函数实训 学分学期转换函数的设计
    jquery dom操作
    jquery clone方法
    Go开发常见陷阱
    Go 语言从新手到大神:每个人都会踩的五十个坑(转)
    Go文件操作大全
    linux下安装go
    Go 学习笔记
    分布式系统设计系列 -- 基本原理及高可用策略 (转)
    安装Redis图形监控工具---RedisLive
  • 原文地址:https://www.cnblogs.com/frankcui/p/12092716.html
Copyright © 2011-2022 走看看