Java包装类
in Java with 0 comment

Java包装类

in Java with 0 comment
  1. Java中为8种基本数据类型又对应准备了8种包装类8种包装类属于引用数据类型,父类是Object

  2. 如果有这么一种需求:调用doSome方法的时候要传一个数字,但是数字属于基本数据类型,而doSome方法参数的类型是Object。可见doSome方法无法接受基本数据类型的数字。

    public static void doSome(Object obj){
      System.out.println(obj);
    }
    

    虽然doSome方法不能直接传int类型,但是可以传一个对应的包装类型

    public static void main(String[] args){
      Integer myInt = new Integer(100);
      doSome(myInt);
    }
    
  3. 8种基本数据类型对应的包转类:

    基本数据类型包装类型
    bytejava.lang.Byte
    shortjava.lang.Short
    intjava.lang.Integer
    longJava.lang.Long
    floatJava.lang.Float
    doublejava.lang.Double
    booleanJava.lang.Boolean
    charJava.lang.Character
  4. 拆装箱

    • 装箱
      将基本数据类型 --(转换)--> 引用数据类型(装箱)

      Integer i = new Integer(100);
      
    • 拆箱
      将引用数据类型 --(转换)--> 基本数据类型(拆箱)

      i.intValue();// 100
      
  5. Integer的构造方法

    Integer有两个构造方法

    Integer(int value)
    Integer(String s)
    

    接受一个int或者String类型的数据

    new Integer(100);// 100
    new Integer("100");// 100
    
  6. 通过访问包装类的常量,来获取最大值和最小值

    Integer.MAX_VALUE;
    Integer.MIN_VALUE;
    
  7. 自动装拆箱

    • 自动装箱

      Integer x = 100;
      
    • 自动拆箱

      int y = x;
      

      虽然支持自动拆箱,当是底层实际上还是

      Integer x = new Integer(100);
      

      由于底层使用的是new的方式创建,所以无法使用双等号"=="进行判断,双等号无法自动拆箱

      Integer a = 1000;
      Integer b = 1000;
      System.out.println(a == b);// false
      

      image.png

  8. 整数型常量池

    java中为了提高程序的执行效率,将**「-128 ~ 127」之间所有的包装对象提前创建好,放到了一个方法区的“整数型常量池”当中,目的是只要用这个区间的数据不需要再new了,直接从整数型常量池**中取出来。

    Integer a = 128;
    Integer b = 128;
    System.out.println(a == b);// false
    Integer x = 127;
    Integer y = 127;
    System.out.println(x == y);// true
    

    以上程序127并不是拆箱了,而是x,y这两个变量中保存的内存地址是同一个。双等号==比较的是对象的内存地址

    image.png

    源代码中,在类加载的时候创建了对应的Integer对象。

    image.png

  9. NumberFormatException 异常

    这个异常是出现在将String类型转int类型的时候

    Integer.parseInt("中文");
    

JDK 1.5之后,支持自动拆箱和自动装箱。

其它包装类和Integer使用方法一样。

在进行类加载的时候,整数型常量池已经初始化好了。