文章目录

  • 基本数据类型
  • 八大数据类型
  • Java类型分类
  • 使用基本数据类型的好处
  • 包装类型
  • 创建对象方法
  • 为什么需要包装类
  • 装箱与拆箱
  • 装箱与拆箱概念
  • 自动拆装箱
  • 自动拆装箱的实现原理
  • 自动拆装箱使用场景
  • 自动拆装箱与缓存
  • 自动拆装箱带来的问题


文章转载:

基本数据类型

八大数据类型

  • 字符型:char
  • 布尔类型:boolean
  • 整数类型:byte、short、int、long
  • 浮点数类型:float、double

Java类型分类

  • 基本类型:在JVM栈中分配空间存值
  • 引用类型:在堆中分配空间存值
  • void类型:Java还存在一种基本类型void,对应的包装类为java.lang.Void,Void是不能被new出来的,因此不能在堆中分配存储空间存储对应的值

使用基本数据类型的好处

在Java语言中,new一个对象是存储在堆中的,我们通过栈中的引用来使用这些对象,是比较费资源的,而常用的基本数据类型,不需要用new创建,数据直接存放在栈中,所以会更加高效。

我们可以知道,在栈中每一个栈帧,都包含了局部变量表,这里局部变量中的数据,就是存储在局部变量表中的

包装类型

基本数据类型 包装类

基本数据类型

包装类

byte

Byte

boolean

Boolean

short

Short

char

Character

int

Integer

long

Long

float

Float

double

Double

创建对象方法

Byte

public class Test04 {
    public static void main(String[] args) {
        Byte a = 2;                                    //通过自动装箱赋值
        Byte b = new Byte(String.valueOf(1));         //通过String创建对象
    }
}

Boolean

public class Test04 {
    public static void main(String[] args) {
        Boolean a = true;          //通过valueOf赋值
        Boolean c = new Boolean(String.valueOf(true));	//通过String
        Boolean b = new Boolean(true);                 	//通过常数
    }
}

Short

public class Test04 {
    public static void main(String[] args) {
        Short a = 1;                                    //通过自动装箱赋值
        Short b = new Short(String.valueOf(1));         //通过String创建对象
    }
}

Character

public class Test04 {
    public static void main(String[] args) {
        Character a = '1';          //通过valueOf赋值
        Character b = new Character('1');                 //通过常数
    }
}

Integer

public class Test04 {
    public static void main(String[] args) {
        Integer a = 2;                                    	//通过自动装箱赋值
        Integer b = new Integer(1);                 		//通过常数
        Integer c = new Integer(String.valueOf(1));       	//通过String创建对象
    }
}

Long

public class Test04 {
    public static void main(String[] args) {
        Long a = Long.valueOf(2);                   //通过valueOf赋值
        Long b = new Long(1);                 		//通过常数
        Long c = new Long(String.valueOf(1));       //通过String创建对象
    }
}

Float

public class Test04 {
    public static void main(String[] args) {
        Float a = Float.valueOf((float) 2.1);          //通过valueOf赋值
        Float b = new Float(1.5);                 	//通过常数
        Float c = new Float(String.valueOf(1));       //通过String创建对象
    }
}

Double

public class Test04 {
    public static void main(String[] args) {
        Double a = Double.valueOf((Double) 2.1);          //通过valueOf赋值
        Double b = new Double(1.5);                 	//通过常数
        Double c = new Double(String.valueOf(1));       //通过String创建对象
    }
}

为什么需要包装类

Java是面向对象的语言,很多地方都是需要使用对象而不是基本数据类型的

比如在集合类中,我们无法将int等数据类型放进去,因为集合的容器要求元素是Object类型

为了让基本类型也具有对象特性,就出现了包装类型,丰富了基本类型的操作

装箱与拆箱

装箱与拆箱概念

装箱:把基本类型转换为包装类的过程就是装箱
拆箱:把包装类转换为基本数据类型就是拆箱

自动拆装箱

在JavaSE5中,为了减少开发人员的工作,Java提供了自动拆装箱功能

自动装箱:将基本数据类型自动转化为对应的包装类
自动拆箱:将包装类自动转化成对应的基本数据类型

自动拆装箱的实现原理

自动装箱都是通过包装类的valueOf方法实现的

自动装箱都是通过包装类对象xxxValue方法实现的(如intValue)

自动拆装箱使用场景

1.将基本类型放入集合类:集合类中都是对象类型,但是我们add(基本数据类型)也不会报错,是因为Java给我们做了自动装箱

java中int与vb中int java void和int_包装类

2.包装类型和基本类型比较大小:包装类与基本数据类型进行比较运算,先将包装类进行拆箱成基本数据类型,然后比较

3.包装类型的运算:对两个包装类型进行运算,会将包装类型自动拆箱为基本类型进行运算

4.三目运算符的使用:如falg?i:j

5.函数参数与返回值

//自动拆箱
public int getNum1(Integer num) {
 return num;
}
//自动装箱
public Integer getNum2(int num) {
 return num;
}

自动拆装箱与缓存

在Java SE5中,Integer操作引入了新功能来节省内存和提高性能

  1. 适用于整数区间-128~+127
  2. 只适用于自动装箱,使用构造函数创建对象不适用
  3. 只适用于整形,浮点型不行
public class Test04 {
    public static void main(String[] args) {
        //不创建对象且在-128~127中
        Integer a = 1;
        Integer b = 1;
        System.out.println(a == b);        //true
        //创建对象且在-128~127中
        Integer c = new Integer(1);
        Integer d = new Integer(1);
        System.out.println(c == d);        //fasle
        //不创建对象且不在-128~127中
        Integer e = 200;
        Integer f = 200;
        System.out.println(e == f);        //false
    }
}

自动拆装箱带来的问题

  1. 包装对象之间的数值比较不能简单的使用==,除了特殊情况(如Integer的-128~127),其他比较都需要使用equals比较
  2. 如果包装类对象为NULL,那么自动拆箱就可能会抛出NPE
  3. java中int与vb中int java void和int_java中int与vb中int_02


  4. java中int与vb中int java void和int_java_03

  5. 如果一个for循环中有大量拆装箱操作,会浪费很多资源