• java包装类


    大纲:

    1. 包装类简介
    2. 创建包装类
    3. 自动装箱、拆箱
    4. 判断相等
    5. 默认值
    6. 其他

    一、包装类简介

    • Java中共有八种基本类型,byte, short, int, long, float, double, char, boolean。
    • 分别对应八种包装类,Byte, Short, Integer, Long,Float, Double, Character, Boolean。
    • 相较于基础数据类型,包装类有许多方法和成员变量供我们使用。
    • 每个包装类型都有一个名为value的成员变量,用来存储它自己基本类型的值。
            Integer a = new Integer(1);//包装类
            int b = 1;//基础类型

    二、创建包装类型

    以Integer为例子,其他包装类类似

            //通过基本类型创建
            new Integer(1);
            Integer.valueOf(1);
            //通过字符串创建
            new Integer("1");  //调用parseInt
            Integer.valueOf("1"); //调用parseInt
            Integer.parseInt("1");

    几种常见创建方式,其他包装类也有类似的创建方法。

    值得注意的是valueOf方法

        public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)
                return IntegerCache.cache[i + (-IntegerCache.low)];
            return new Integer(i);
        }

    可以发现使用了缓存,看下这个IntegerCache,它是Integer的嵌套类

        private static class IntegerCache {
            static final int low = -128;
            static final int high = 127;//默认127,可配置
            static final Integer cache[];
            static {
                //将-128至127的包装类缓存到cache中
            }
        }

    也就是说使用valueOf()来创建值为-128至127的包装类时,会使用已经创建好的缓存。我们创建包装类尽量使用这个方法避免重复创建对象。

    还有一点需要注意的是,有2个包装类(Float, Double)是不使用缓存的

    三、自动装箱、拆箱

            Integer a = 1; //自动装箱,反编译后发现使用Integer.valueOf(1)方法
            int b = a; //自动拆箱,反编译后发现使用a.intValue()方法

    java1.5以后,编译器会帮助我们完成自动装箱拆箱、不需要我们手动转换。

    四、判断相等

            //基础类型判断相等直接用==判断即可
            //包装类型判断相等用equals,通过源码可知,比较的是两个包装类的基础类型的value值。
    //基础类型和包装类型比较 int a = 1; Integer b = 1; System.out.println(a==b);//true,这里b会被自动拆箱 //包装类用==比较 Integer c = 1; Integer d = 1; System.out.println(c==d); //true,包装类自动装箱使用的是valueOf()方法,使用的是缓存 Integer e = 200; Integer f = 200; System.out.println(c==d); //false,这里由于200>127没有使用缓存,使用的都是new Integer()

    五、默认值

    包装类没有默认值,基础数据类型有初始化默认值。

        private static int a;
        private static Integer b;
        public static void main(String[] args) {
            System.out.println(a);//0
            System.out.println(b);//null
        }

    使用的时候需要注意与数据库打交道的po对象尽量使用包装类,因为数据库查询结果为null时,使用基础数据类型会被赋上默认值。

    六、其他

    • 泛型只能使用包装类。
    • 计算的时候避免基础类型与包装类直接运算(Long+long 一个包装类与基础类型直接加法运算),会导致自动拆装箱,影响性能。
  • 相关阅读:
    我的第一个项目--总结
    c++中的继承
    指针带来的意想不到的功能紊乱
    一个很难发现的内存泄漏
    我的第一个项目--迭代开发总结
    内存访问冲突问题(非法内存访问)
    Debug Assertion Failed mfc140ud.dll
    javaweb 开发总结五-----servlet开发(一)
    javaweb学习总结四---http协议
    Tomcat服务器学习和使用二·
  • 原文地址:https://www.cnblogs.com/liuboyuan/p/11868613.html
Copyright © 2020-2023  润新知