包装类型


包装类型

每个基本类型都有其对应的包装类型[对象类型]

byte->Byte

short->Short

int->Integer

long->Long

float->Float

double->Double

char->Character

boolean->Boolean

学习掌握目标

  1. 包装类型的api的常用方法
  2. 包装类型和基本数据类型以及String类型三者之间的相互转换问题.

Number

api:java.lang包,所有关于上面包装类型[数字]的共同的抽象的父类.

byte byteValue()返回指定号码作为值 byte ,这可能涉及舍入或截断。
abstract double doubleValue()返回指定数字的值为 double ,可能涉及四舍五入。
abstract float floatValue()返回指定数字的值为 float ,可能涉及四舍五入。
abstract int intValue()返回指定号码作为值 int ,这可能涉及舍入或截断。
abstract long longValue()返回指定数字的值为 long ,可能涉及四舍五入或截断。
short shortValue()返回指定号码作为值 short ,这可能涉及舍入或截断。

提供的这些方法都是关于包装类型转换成对应的基本类型的方法

Integer

构造

  1. Integer(int i);//利用int类型的整数来构建一个Integer对象 - int类型->Integer类型

  2. Integer(String s);//此处的字符串一定是数字形式的字符串 - String类型->Integer类型

    如果传入的是一个非数字形式的字符串,那么会抛出java.lang.NumberFormatException数字格式化失败异常

自动解封箱

jdk5.x开始支持的新的功能

  1. 封箱 - 基本数据类型可以自动转换成对应的包装类型
  2. 解箱 - 包装类型可以自动转换成对应的基本的数据类型

常用方法

  1. static Integer valueOf(int i);//将int->Integer

    [-128,127] -> 比较的结果是true,不在这个范围的是返回false
    
    //如果[-128,127]之间,那么直接返回内部的缓冲数组中的数据
    //如果不在这个范围,返回一个新的Integer对象
    public static Integer valueOf(int i) {
      if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
      return new Integer(i);
    }
    
    Integer类内部有一个静态内部类
    private static class IntegerCache {
        static final int low = -128;
        static final int high;
        //缓冲区,提供了缓冲的数组,数组在静态代码块中进行预初始化,提前赋值了.
        static final Integer cache[];
    
        static{
    
          cache = new Integer[(high - low) + 1];
          int j = low;
          for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);
        }
      }
    
    //  [-128,127] -> 比较的结果是true,不在这个范围的是返回false
    //剖析自动封箱
    Integer a = 127;//Integer a = Integer.valueOf(127);
    Integer b = 127;
    System.out.println(a == b);//true
    
    admindeMacBook-Pro:Desktop admin$ javap -c IntegerHello
    Compiled from "IntegerHello.java"
    public class IntegerHello {
      public IntegerHello();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: return
    
      public static void main(java.lang.String[]);
        Code:
           0: bipush        127
           2: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
           5: astore_1
           6: bipush        127
           8: invokestatic  #2                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
          11: astore_2
          12: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
          15: aload_1
          16: invokevirtual #4                  // Method java/lang/Integer.intValue:()I
          19: bipush        7
          21: if_icmpne     28
          24: iconst_1
          25: goto          29
          28: iconst_0
          29: invokevirtual #5                  // Method java/io/PrintStream.println:(Z)V
          32: return
    }
    
  2. 关于进制转换的方法

    2-1. static String toBinaryString(int n);//十进制n转换成对应的二进制

    2-2. static String toHexString(int n);//十进制n转换成对应的十六进制

    2-3. static String toOctalString(int n);//十进制n转换成对应的八进制

  3. static int parseInt(String s);//将数字形式的字符串转换成int类型,如果传入的是一个非数字形式的字符串,那么会抛出java.lang.NumberFormatException数字格式化失败异常

  4. static Integer valueOf(String s);//String->Integer

总结

包装类型和基本数据类型以及String类型三者之间的相互转换问题.

  1. int->Integer

    1. java.lang.Integer的构造Integer(int n)
    2. jdk5.0提供的自动封箱Integer a = 10;
    3. java.lang.Integer提供的static Integer valueOf(int n);
    
  2. Integer -> int

    1. int intValue();//java.lang.Number提供的抽象方法,java.lang.Integer重写了该方法
    2. jdk5.0提供的自动解箱
    
  3. int->String

    1. java.lang.String提供的方法static String valueOf(int n);
    
  4. String->int

    1. java.lang.Integer类static int parseInt(String s);
    
  5. String->Integer

    1. java.lang.Integer的构造Integer(String n)
    2. java.lang.Integer的方法static String valueOf(String n);
    
  6. Integer->String

    1. java.lang.Integer的String toString();
    2. java.lang.String中提供了static String valueOf(Object obj);
    

作业1

笔试题:int和Integer之间的区别

  1. Integer是int的包装类;int是基本数据类型;
  2. Integer变量必须实例化后才能使用;int变量不需要;
  3. Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ;
  4. Integer的默认值是null;int的默认值是0。
  5. 泛型不支持int,但是支持Integer
  6. int 存储在栈中,Integer 对象的引用存储在栈空间中,对象的数据存储在堆空间中。

作业2


文章作者: 码农耕地人
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 码农耕地人 !
  目录