java包装类

Posted 扶不起的刘阿斗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 一个包装类与基础类型直接加法运算),会导致自动拆装箱,影响性能。

以上是关于java包装类的主要内容,如果未能解决你的问题,请参考以下文章

Java 封装

Java 封装

Java 封装

Java 封装

Java封装

Java基础:封装