Copyright©Stonee

面向对象语言中仅仅有基本数据类型是不够的的,只有基本数据类型无法对他们进行基本的操作。这就诞生了将基本数据类型包装成类的手段,可以通过这些包装类的各种方法对他们进行各种骚操作。

1. 八种基本数据类型

数据类型 包

  • byte ---------> Byte
  • short ---------> Short
  • int ---------> Integer
  • long ---------> Long
  • float ---------> Float
  • double ---------> Double
  • char ---------> Char
  • boolean ---------> Boolean

看一下他们的树结构

java.lang.Object
  java.lang.Character
  java.lang.Boolean
  java.lang.Number
   java.lang.Byte
   java.lang.Double
   java.lang.Float
   java.lang.Integer
   java.lang.Long
   java.lang.Short

2. 自动装箱和自动拆箱

如何将基本数据和基本数据包装类相互转换呢?

  我们来看一个java语句:

  • 将数据类型转换为类:

Integer n = Integer.valueOf(3); 就是通过类的valueOf方法

这个叫做装箱

  • 将类转换为数据类型:

int n = (Integer) xxx.intValue(); 通过类的intValue方法

这个叫做拆箱

自动装箱和自动拆箱的意思就是编译器会自动通过上述方法进行基本数据类型和其包装类的转换

如下:

Integer n = 3; // 编译器会自动变为 Integer n = Integer.valueOf(3);

int n = a;  //a为Integer类型,编译器会自动变为 int n = a.intValue();

看一个特例,当一个表达式中混合使用Integer和Double类型的时候,Integer的值就会先自动拆箱变为int,然后将int提升为double,在装箱为Double,如下:

Integer n = 1;
Double x = 2.0;
System.out.println(true ? n : x);//会打印出1.0

3. 从Integer类观察8中数据类型包的常用字段和方法

  • 常用字段
System.out.println(Integer.MAX_VALUE);        
System.out.println(Integer.MIN_VALUE);  //最大值和最小值
  • 构造方法
Integer i1 = new Integer(100);
System.out.println(i1)

;Integer i2 = new Integer("100"); //但不能是“abc”
System.out.println(i2);

//构造方法已经被舍弃
  • 普通方法
System.out.println(String.valueOf(100));    //將int轉換為字符串        
     System.out.println(i2.toString());  //通過類轉換為字符串        
     
     //基本包裝類中有7中除了Char都有parseXxx方法,可以将字符串转化为基本数据   
     System.out.println(Integer.parseInt("666"));

4. 从一些面试题中浅学包装类

Integer a = new Integer(100);        
    Integer b = new Integer(100);        
    System.out.println(a == b);     //false ,有两个对象,地址不同  
    System.out.println(a.equals(b));    //true  重写了equals方法,比较的是属性值        
    
    Integer c = 127;        
    Integer d = 127;        
    System.out.println(c == d);     //true    引用常量池中同一个127   
    System.out.println(c.equals(d));    //true        
    
    Integer e = 128;       
    Integer f = 128;        
    System.out.println(e == f);     //false     常量池中没有,需要新创建
    System.out.println(e.equals(f));    //true

解释第二个和第三个问题:因为-128~127是byte的取值范围,如果在这个取值范围内,自动装箱就不会创建对象,而是从常量池的数组中获取,如果超过了这个范围,会再新建对象,可查看valueOf源码