Java 包装类 (Integer Character)

1 什么是包装类

    包装类(Wrapper Class): Java是一个面向对象的编程语言,但是Java中的八种基本数据类型却是不面向对象的,为了使用方便和解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八种基本数据类型对应的类统称为包装类(Wrapper Class),包装类均位于java.lang包。

    为什么不是面向对象的就会出现不足,是哪里不足??

           java中的数据类型int,double等不是对象,无法通过向上转型获取到Object提供的方法,而像String却可以,只因为String是一个对象而不是一个类型。基本数据类型由于这样的特性,导致无法参与转型,泛型,反射等过程。为了弥补这个缺陷,java提供了包装类。因为8大基本数据类型不是类,所以它们也没有对应的方法和变量,也就没有各种各样的功能。更主要的一点,在一些场景当中,我们是不能使用基本数据类型只能使用对象的。比如一些容器,像是ArrayList、HashMap只能接受一个对象,再比如我们提供了一个方法,但是调用方有可能传入一个空值。如果我们使用基本数据类型,null会引发报错。

所以包装类正是为了解决这个问题而产生的。

2 基本数据类型与对应的包装类型

    3 包装类的使用场景

                1)集合类泛型只能是包装类

// 编译报错

List<int> list1 = new ArrayList<>();

// 正常

List<Integer> list2 = new ArrayList<>();

                2)成员变量不能有默认值的情况

private int  status;

基本数据类型的成员变量值都有默认值,如上述代码status 默认为0,如果定义中 0 代表失败,那样就会有问题,这样只能使用包装类 Integer,它的默认值为 null,所以就不会有默认值影响。

                3)方法的参数允许定义空值,即null值

private static void test1(int status){

    System.out.println(status);

}

看以上代码,方法参数定义的是基本数据类型 int,所以必须得传一个数字过来,不能传 null,很多场合我们希望是能传递 null 的,所以这种场合用包装类比较合适。

        4 自动装箱和拆箱

                    Java 5 增加了自动装箱、拆箱机制,提供基本数据类型和包装类型的相互转换操作。

                    自动装箱:Integer i1=8; //int 8 自动转为Integer型

                    自动拆箱:int i2= i1;   //将Integer型转为 基本数据类型 int

        这些过程由JDK 编译器自动装箱完成的 即 会自动调用 Integer.valueOf() 方法

        5 包装类的实际使用(int 和 Integer 为例)

                1) int和Integer类之间的转换 (下文会提到自动装箱和拆箱)

                        在实际转换时,使用Integer类的构造方法和Integer类内部的intValue方法实现这些类型之间的相互转换:

        int n=5;

        Integer n1=new Integer(n);

        System.out.println("int类型转换为integer类:"+n1);

        //

        Integer i=new Integer(50);

        int i1 = i.intValue();

        System.out.println("integer类转换为int类型:"+i1);

 

                2) Integer 类内部的常用方法

                        Integer类的主要方法有:parseInt方法和toString方法。 

       //parseInt方法: 数字字符串类型转成int类型

        String ss="123";

        int ii = Integer.parseInt(ss);

        System.out.println("字符类型转成整型:"+ii);

        //toString方法:int类型转成数字字符串类型

        int ii2=123;

        String ss2 = Integer.toString(ii2);

        System.out.println("int类型转成数字字符串类型:"+ss);

3)求包装类中存储的类型的范围上下界,Integer当中的MAX变量,存储的是Int范围的上届,Integer当中的MIN存储的Int范围的下届。再比如Integer当中的max方法,接受两个参数,返回比较大的那个值。    

		System.out.println(Integer.MAX_VALUE);//求Integer类型的最大值
		System.out.println(Integer.MIN_VALUE);//求Integer类型的最小值

    6 包装类的缓存值

Boolean:true和false

Byte:-128~127

Character:0~127

Short:-128~127

Integer:-128~127

Long:-128~127  //注意,这里不是 long的范围,就是-128-127 

注意:float 和double 没有缓存值

            特别注意事项:

           采用 Integer num1=10  ;   或  Integer num1=Integer.valueOf(10) 的方式创建num1对象时, 如果右侧的数值在上述值范围内,那么进行装箱的时候,并不是创建一个新对象而是使用缓存中的对象,如果超出范围则需要新建立对象。

            而Integer num1=new Integer(10);  这个虽然10在上述缓存之内,但是它是创建对象,并没有利用缓存值。

public class test {

       public static void main(String[] args) {

       Integer num1=10;

       Integer num2=10;

       System.out.println(num1==num2);//利用的是缓存中的值,输出true

       

       Integer i1=Integer.valueOf(1);

       Integer i2=Integer.valueOf(1);

       System.out.println(i1==i2);//利用的是缓存中的值,输出true

       

       Integer i3=128;

       Integer i4=128;

       System.out.println(i3==i4);//128超出了缓存值,创建新对象,输出false



       Integer i5=128;

       Integer i6=128;

       System.out.println(i5.equals(i6));//equal 比较的是对象,==比较的是地址对象地址是否相等

       }}

            明确equal方法与==的区别:

                    equals() 比较的是两个对象的值(内容)是否相同。

                    “==” 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。

        总结:    java定义:在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象.

参考博客:https://blog.csdn.net/qq_29119581/article/details/78327759

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值