码迷,mamicode.com
首页 > 其他好文 > 详细

常用类-包装类

时间:2020-09-17 21:23:05      阅读:34      评论:0      收藏:0      [点我收藏+]

标签:stat   通过   pre   存在   img   object   format   新建   src   

包装类

概念

  • 官方文档的java.lang包中可查看

  • 基本数据类型所对应的引用数据类型

  • Object可统一所有类,包装类的默认值为Null

  • 对应关系

    技术图片

  • 基本数据类型无方法可用,想使用方法需转换成包装类型,下图为官方文档中的Byte类的部分方法

    技术图片

类型转换与装箱、拆箱

概念
  • 基本数据类型存储在栈空间中

  • 引用类型数据存储在堆空间中

  • 装箱、拆箱就是类型转换

  • 装箱就是将基本类型转换成引用类型的过程(基本类型转换成包装类)

  • 拆箱就是将引用类型转换成基本类型的过程(包装类转换成基本类)

  • 八种包装类提供不同类型间的转换方式

    • Number父类中提供六种共性方法

      技术图片

    • parseXXX()静态方法,引用类型转换为基本类型

    • valueOf()静态方法,基本类型转换为引用类型

  • 注意:需保证类型兼容,否则抛出异常

    String str = "12a";
    int i3 = Integer.parseInt(str);
    

    异常:Exception in thread "main" java.lang.NumberFormatException: For input string: "12a"

intInteger的转换
  • Integer的相关方法

    • 构造方法

    技术图片

    • valueOf(int i)方法

    技术图片

    • intValue()

    技术图片

  • 装箱

    //装箱:转换成包装类
    //基本数据类型
    int num1 = 1;
    //创建Integer类进行转换
    //1.用构造方法
    Integer integer1 = new Integer(num1);
    //2.valueOf()方法
    Integer integer2 = valueOf(num1);
    
  • 拆箱

    //拆箱:转换成包装类
    //创建Integer实例
    Integer integer3 = new Integer(2);
    //intValue()方法
    int num2 = integer3.intValue();
    
  • JDK1.5之后提供自动装箱和拆箱

    //基本数据类型
    int num1 = 1;
    //自动装箱
    Integer integer4 = num1;
    //自动拆箱
    int num4 = integer4;
    
基本类型和字符串之间的转换
  • 基本类型转成String

    //1.基本类型转换成String
    int num = 10;
    //1.1 加""
    String s1 = num+"";
    //1.2 静态方法valueOf()
    String s2 = valueOf(num);
    //1.3 Integer的toString()
    Integer i1 = new Integer(num);
    String s3 = i1.toString(); 
    
  • String转换成基本类型

    //2.String转换成基本类型
    String str = "12";
    //2.1静态方法parseXXX()
    int i2 = parseInt(str);
    //2.2Integer的parseInt
    int i3 = Integer.parseInt(str);
    
  • boolean的特殊情况

    //3.注意boolean字符串形式转成基本类型,"true"-->true,非"true"-->false
    String str1 = "true";
    String str2 = "yes";
    String str3 = "false";
    //用Boolean的parseBoolean方法
    boolean b1 = Boolean.parseBoolean(str1);
    boolean b2 = Boolean.parseBoolean(str2);
    boolean b3 = Boolean.parseBoolean(str3);
    System.out.println(b1);//输出为true
    System.out.println(b2);//输出为false
    System.out.println(b3);//输出为false
    

整数缓冲区

概述
  • Java预先创建了256个常用的证书包装类对象

  • 在实际应用中对已创建的对象进行复用

面试题
  • 代码

    //面试题,判断值相同的两个Integer实例是否相等
    //1.通过new Integer对象
    Integer integer1 = new Integer(100);
    Integer integer2 = new Integer(100);
    System.out.println(integer1 == integer2);//输出为false
    //2.自动装箱,值为100
    Integer integer3 = 100;
    Integer integer4 = 100;
    System.out.println(integer3 == integer4);//输出为true
    //3.自动装箱,值为200
    Integer integer5 = 200;
    Integer integer6 = 200;
    System.out.println(integer5 == integer6);//输出为false
    
  • 分析

    • 将.class文件反编译(拖入XJad中),发现自动装箱使用的是valueOf()方法

      技术图片

    • 查看IntegervalueOf()源码

      public static Integer valueOf(int i) {
          if (i >= IntegerCache.low && i <= IntegerCache.high)
              return IntegerCache.cache[i + (-IntegerCache.low)];
          return new Integer(i);
      }
      

      发现Integer存在缓冲区(以数组的形式存在于堆中),大于low、小于high的数直接返回缓冲区中的值,否则才创建新对象

    • 进一步查看源码

      技术图片

      low=-128high=127,即Integer缓冲区包括大于-129,小于128的256个数,在这个范围内的数值相同时,引用地址也相同

    • 题目解析

      • 1.通过new Integer创建了两个实例,实质是在堆空间中开辟了两个空间,在栈空间中的引用指向不同地址,所以两个对象不相等,返回false

      • 2.通过自动装箱即valueOf()方法,值为100,此时因为100处于整数缓冲区内,直接返回缓冲区中的地址,integer3integer4的引用地址相同,所用相等

        技术图片

      • 3.通过自动装箱即valueOf()方法,值为200,此时因为200不在整数缓冲区内,所以要新建两个对象,在堆中开辟两个空间,所以引用地址不同,两个值不相等

栈和堆简要介绍

https://www.cnblogs.com/fsg6/p/12752222.html

常用类-包装类

标签:stat   通过   pre   存在   img   object   format   新建   src   

原文地址:https://www.cnblogs.com/c1ao/p/13648365.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!