• 包装类


    包装类型介绍

    Java 为 8 种基本数据类型分别定义了相应的引用类型,称之为基本数据类型的包装类。

    基本数据类型 包装类
    byte Byte
    short Short
    int Integer
    long Long
    char Character
    float Float
    double Double
    boolean Boolean

    包装类跟 String 类很像,都是 final 类,都维护着一个存储内容的 private final 成员,内部都没有更改数据的方法,因此都是不可变类。如 Integer 类:

    public final class Integer extends Number implements Comparable<Integer> {
         private final int value;
    }
    

    自动装箱和自动拆包

    • 自动装箱:把一个基本类型变量直接赋给对应的包装类变量;
    • 自动拆包:把包装类对象直接赋给一个对应的基本类型变量。
    public static void main(String[] args) {
        //自动装箱
        Integer a = 5;
        //自动拆箱
        int b = a;
    
        //true先转成Boolean类型,然后赋给最上层父类Object的引用变量
        Object c = true;
        if (c instanceof Boolean) {
            boolean d = (Boolean) c;
            System.out.println(d);  //true
        }
    }
    

    注意:自动装箱机制本质上是调用包装类的静态方法 valueOf() 方法来创建对象的,自动装箱机制本质上是调用包装类对象的 xxxValue() 方法。

    public static void main(String[] args) {
        Integer a = Integer.valueOf(5);  //装箱
        int b = a.intValue();   //拆箱
        System.out.println(b);  //5
    }
    

    基本类型变量和字符串转换

    字符串转基本类型

    • 除 Character 外,其他包装类都提供了 parseXXX(String s) 静态方法
    • 包装类提供 valueOf(String s) 静态方法
    public static void main(String[] args) {
        String intStr = "123";
        //将字符串转int变量
        int int1 = Integer.parseInt(intStr);
        int int2 = Integer.valueOf(intStr);
        System.out.println(int1);  //123
    
        String floatStr = "3.14";
        //将字符串转float变量
        float ft1 = Float.parseFloat(floatStr);
        float ft2 = Float.valueOf(floatStr);
        System.out.println(ft2);  //3.14
    }
    

    基本类型转字符串

    • String 类提供多个重载 valueOf() 静态方法
    • 使用 + 号拼接
    public static void main(String[] args) {
        //通过valueOf的方式
        String ftStr = String.valueOf(2.35f);
        System.out.println(ftStr);  //2.35
    
        //通过+的方式
        String intStr = "" + 5;
        System.out.println(intStr);  //5
    }
    

    缓存池

    包装类提供了数据缓存机制(数组),当第一次加载包装类时,会初始化缓存池。当使用 valueOf() 方法创建包装类对象时,先判断数据是在缓存池中已存在,如果在就直接返回缓存池中数据的引用。

    //cache就是Integer对象的缓存池,是个被final修饰的静态数组
    //第一次加载Integer类时,会先初始化cache数组,初始化完毕后,数据不可更改
    static final int low = -128; 
    static final int high; 
    static final Integer[] cache; 
    

    只有 Boolean、Byte、Short、Integer、Character 有缓存机制,其他包装类没有:

    • Boolean 缓存池数据:true 和 false
    • Byte 缓存池数据:所有范围值,即 -128 ~ 127
    • Short 换存池数据:-128 ~ 127
    • Integer 缓存池数据:-128 ~ 127,上界可以调
    • Character 缓存池数据:u0000 ~ u007F,即 0 ~ 127

    new Interger(100)Integer.valueOf(100) 的区别:

    • new Interger(100) 每次都会创建一个新对象
    • Integer.valueOf(100) 会使用缓存池中的对象,多次调用返回同一个对象的引用
    public static void main(String[] args) {
        //创建新对象
        Integer x = new Integer(100);
        Integer y = new Integer(100);
        System.out.println(x == y);    // false
    
        //使用缓存池
        Integer z = Integer.valueOf(90);
        Integer k = Integer.valueOf(90);
        System.out.println(z == k);   // true
    
        //使用缓存池,自动装箱过程自动调用valueOf()方法
        Integer a = 80;
        Integer b = 80;
        System.out.println(a == b);   //true
    }
    
  • 相关阅读:
    拓扑排序,bitset~[JSOI2015]最小表示
    字符串算法~KMP
    校内团队训练赛2
    校内团队训练赛
    CodeForces
    莫队算法基础与练习
    lintcode-452-删除链表中的元素
    lintcode-451-两两交换链表中的节点
    lintcode-450-K组翻转链表
    lintcode-445-余弦相似度
  • 原文地址:https://www.cnblogs.com/zongmin/p/11338771.html
Copyright © 2020-2023  润新知