目录

  • 包装类理解
  • 内存层面
  • 包装类作用
  • 基本数据类型与包装类
  • 自动装箱,拆箱
  • 字符串转包装类


包装类理解

内存层面

包装类的本质就是创建了一个对象,用一个对象,把基本数据类型给包起来

这张图可以很好的理解包装类是对象,因为它是在堆内存开辟的空间

java Long 包装类 加法 java包装类对象_包装类


包装类作用

包装类:是基本数据类型对应的引用类型

废话不多说,它的作用在于
1.由于多态的特性,所有对象都可以用object来接收,但如果是基本数据类型,就无法接收,有局限性

2.集合中的是不能存储基本数类型的,只能存对象,所以要用到包装类


基本数据类型与包装类

下面是基本数据类型各自对应的包装类,区别较大的是char和int,尤其是Integer用的最多

java Long 包装类 加法 java包装类对象_java Long 包装类 加法_02

java Long 包装类 加法 java包装类对象_java Long 包装类 加法_03


JDK5以前的数据转换,装箱,拆箱
基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:

  • 装箱:从基本类型转换为对应的包装类对象。
  • 拆箱:从包装类对象转换为对应的基本类型。

int型转换为Integer

int a = 1;
Integer i1 = Integer.valueof(a);

Integer转int型

int b = i1.intValue();

这里有一个问题要注意

//底层原理:
//因为在实际开发中,-128~127之间的数据,用的比较多。
//如果每次使用都是new对象,那么太浪费内存了
//所以,提前把这个范围之内的每一个数据都创建好对象
//如果要用到了不会创建新的,而是返回已经创建好的对象。
Integer i6 = Integer.valueOf(127);
Integer i7 = Integer.valueOf(127);
System.out.println(i6 == i7);//true

Integer i8 = Integer.valueOf(128);
Integer i9 = Integer.valueOf(128);
System.out.println(i8 == i9);//false

建议:获取Integer对象的时候不要自己new,而是采取直接赋值或者静态方法valueOf的方式

因为在实际开发中,-128~127之间的数据,用的比较多。如果每次使用都是new对象,那么太浪费内存了。

所以,提前把这个范围之内的每一个数据都创建好对象,如果要用到了不会创建新的,而是返回已经创建好的对象。


自动装箱,拆箱

由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。例如

Integer i = 4;//自动装箱。相当于Integer i = Integer.valueOf(4);
i = i + 5;//等号右边:将i对象转成基本数值(自动拆箱) i.intValue() + 5;
//加法运算完成后,再次装箱,把基本数值转成对象。

字符串转包装类

下面是两种常用的转型

  • public static int parseInt(String s):将字符串参数转换为对应的int基本类型。
  • public static long parseLong(String s):将字符串参数转换为对应的long基本类型。

转换方式

  • 方式一:先将字符串数字转成Integer,再调用valueOf()方法
  • 方式二:通过Integer静态方法parseInt()进行转换

示例代码

public class IntegerDemo {
    public static void main(String[] args) {
        //String --- int
        String s = "100";
        //方式1:String --- Integer --- int
        Integer i = Integer.valueOf(s);
        //public int intValue()
        int x = i.intValue();
        System.out.println(x);
        //方式2
        //public static int parseInt(String s)
        int y = Integer.parseInt(s);
        System.out.println(y);
    }
}