anonymous的Java学习笔记(15)——Java8增强的包装类及其用法

Java8增强的包装类及其用法

Java是面向对象的编程语言,但它也包含了8种基本数据类型,这8种基本数据类型不支持面向对象的编程机制,基本数据类型的数据也不具备"对象"的特性:没有成员变量、方法可以被调用。

为了解决8种基本数据类型的变量不能当成Object类型变量使用的问题,Java提供了包装类(Wrapper Class)的概念,为8种基本数据类型分别定义了相应的引用类型,并称之为基本数据类型包装类

基本数据类型包装类
byteByte
shortShort
intInteger
longLong
charCharacter
floatFloat
doubleDouble
booleanBoolean

从上表可以看出,除intchar有点例外之外,其它的基本数据类型对应的包装类都是将其首字母大写即可。

  • 在JDK1.5之前
    • 基本数据类型变量变成包装类实例需要通过对应包装类valueOf()静态方法来实现。
    • 若想获得包装类对象中包装的基本类型变量,需要使用包装类提供的xxxValue()实例方法来实现。
  • 在JDK1.5之后
    • JDK1.5提供了自动装箱((Autoboxing)自动拆箱(AutoUnboxing)功能。
      • 自动装箱:可以把1个基本类型变量直接赋给对应的包装类变量。或者赋值给Object变量(Object是所有类的父类,子类对象可以直接赋值给父类变量)。
      • 自动拆箱:允许直接把包装类对象直接赋给一个对应的基本类型变量
      • 自动装箱/自动拆箱代码示例
        package com.abc.part5;
        
        /**
         * @author mi
         */
        public class AutoBoxingUnboxing {
            public static void main(String[] args) {
                //直接把一个int基本类型变量赋值给integer类型的变量
                Integer intVar1 = 5;
                //直接把一个int基本类型变量赋值给Object类型的变量
                Object intVar2 = 6;
                //直接把一个boolean基本类型变量赋值给Object类型的变量
                Object boolVar3 = true;
                int aa = intVar1;
                System.out.println("intVar2:" + intVar1);
                System.out.println("intVar2:" + intVar2);
                System.out.println("boolVar3:" + boolVar3);
                System.out.println("aa:" + boolVar3);
                if (boolVar3 instanceof Boolean) {
                    boolean bb = (Boolean) boolVar3;
                    System.out.println("bb:" + bb);
                }
                /**
                 * 输出:
                 * intVar2:5
                 * intVar2:6
                 * boolVar3:true
                 * aa:true
                 * bb:true
                 */
            }
        }
        
    • JDK提供了自动装箱自动拆箱功能后,大大简化了基本类型变量包装类对象之间的转换过程。

基本类型变量和和字符串之间的相互转换

  1. 字符串类型的值转换为基本类型的值的两种方式
    1. 利用包装类提供的parseXxx(String s)静态方法(除Character之外的所有包装类都提供了该方法。)
    2. 利用包装类提供的valueOf(String s)静态方法。
  2. 基本类型变量转换成字符串
    1.String类提供了多个重载valueOf()方法,用于将基本类型变量转换成字符串
    1. 基本类型变量""(字符串)+进行连接运算,系统会自动把基本类型变量转换成字符串
      package com.abc.part5;
      public class Primitive2String {
          public static void main(String[] args) {
              // intStr 的值为 5"
              String intStr = 5 + ""; 
          }
      }
      

代码示例

package com.abc.part5;

/**
 * @author mi
 */
public class Primitive2String {
    public static void main(String[] args) {
        //把一个特定字符串转换成 int 变量
        String intStr = "2020";
        int aa = Integer.parseInt(intStr);
        int ab = Integer.valueOf(intStr);
        System.out.println("aa:" + aa);
        System.out.println("ab:" + ab);
        System.out.println("*********************************************************");
        //把一个特定字符串转换成 float 变量
        String floatStr = "21.56";
        float ac = Float.parseFloat(floatStr);
        float ad = Float.valueOf(floatStr);
        System.out.println("ac:" + ac);
        System.out.println("ad:" + ad);
        System.out.println("*********************************************************");
        //把一个 float 变量转换成 String 变量
        String ftStr = String.valueOf(78.9f);
        System.out.println("ftStr:" + ftStr);
        //把一个double 变量转换成 String 变量
        String dbStr = String.valueOf(78.999);
        System.out.println("dbStr:" + dbStr);
        //把一个boolean变量转换成String变量
        String boolStr1 = String.valueOf(false);
        String boolStr2 = String.valueOf(true);
        System.out.println("boolStr1:" + boolStr1);
        System.out.println("boolStr2:" + boolStr2);
        /**
         * 输出
         * aa:2020
         * ab:2020
         * *********************************************************
         * ac:21.56
         * ad:21.56
         * *********************************************************
         * ftStr:78.9
         * dbStr:78.999
         * boolStr1:false
         * boolStr2:true
         */
    }
}

通过上面程序可以看出基本类型变量和字符串之间的转换关系,如下图所示
基本类型变量和字符串之间的转换关系

包装类的实例与数值类型的值进行比较

虽然包装类型的变量引用数据类型,但包装类的实例可以与数值类型的值进行比较,这种比较是直接取出包装类实例所包装的数值来进行比较的。

代码示例

package com.abc.part5;

/**
 * @author mi
 */
public class WrapperClassCompare {
    public static void main(String[] args) {
        //一个包装类实例与数值进行比较
        Integer aa = Integer.valueOf("6");
        Integer ab = Integer.valueOf("6");
        //false
        System.out.println(aa > 7);
        //两个包装类实例进行比较
        //true
        System.out.println(Integer.valueOf("5").equals(Integer.valueOf("5")));
        //true
        System.out.println(aa.equals(ab));

    }
}

包装类的compare()方法

Java7为所有的包装类都提供了一个静态的compare(xxx val1 , xxx val2) 方法,这样开发者就可以通过包装类提供的compare(xxx val1, xxx val2)方法来比较两个基本类型值的大小,包括比较两个boolean类型值。

package com.abc.part5;

/**
 * @author mi
 */
public class WrapperClassCompare1 {
    public static void main(String[] args) {
        System.out.println("******************************");
        System.out.println(Integer.compare(10, 11));
        System.out.println(Integer.compare(10, 10));
        System.out.println(Integer.compare(11, 10));
        System.out.println("******************************");
        System.out.println(Float.compare(10.12f, 11.34f));
        System.out.println(Float.compare(10.12f, 10.12f));
        System.out.println(Float.compare(11.34f, 10.12f));
        System.out.println("******************************");
        System.out.println(Double.compare(10.79, 11.54));
        System.out.println(Double.compare(10.79, 10.79));
        System.out.println(Double.compare(11.54, 10.79));
        System.out.println("******************************");
        System.out.println(Character.compare('中', '国'));
        System.out.println(Character.compare('中', '中'));
        System.out.println(Character.compare('国', '中'));
        System.out.println("..............................");
        System.out.println(Character.compare('华', '夏'));
        System.out.println(Character.compare('华', '华'));
        System.out.println(Character.compare('夏', '华'));
        System.out.println("******************************");
        System.out.println(Boolean.compare(true, false));
        System.out.println(Boolean.compare(true, true));
        System.out.println(Boolean.compare(false, true));
        /**
         * 输出:
           ******************************
           -1
           0
           1
           ******************************
           -1
           0
           1
           ******************************
           -1
           0
           1
           ******************************
           -2256
           0
           2256
           ..............................
           -1473
           0
           1473
           ******************************
           1
           0
           -1
         */

    }
}