java8增强的包装类

为了解决8种基本类型的变量不能当成Object类型变量使用的问题,Java提供了包装类(Wrapper Class)的概念,为8种基本类型分别定义了相应的引用类型,并称之为基本类型的包装类。
在这里插入图片描述
除int和char有点例外,其他的基本数据类型对应的包装类都是将其首字母大写即可。
包装类的两个功能
1自动装箱和自动拆箱
JDK1.5之后提供了自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)功能。

  • 自动装箱:把一个基本类型变量直接赋值给对应的包装类变量,或者赋给Object变量(Object类是所有类的父类,子类对象可以直接赋值给父类变量)。
  • 自动拆箱:允许直接把一个包装类直接赋给对应的基本类型变量。
    进行自动装箱和拆箱时要注意类型匹配问题。例如int类型变量只能装箱为integer类(即使赋给Object类型变量,那也只是利用了Java向上自动转换类型特性)
    借助于包装类的使用,再加上JDK1.5提供的自动装箱,自动拆箱功能,开发者可以将基本类型变量近似的当作对象来用。
    开发者也可以将包装类的实例近似的当成基本类型来使用。
public class AutoBoxingUnboxing
{
   public static void main(String[] args)
   {
      Integer inObj = 5;
       Object boolObj = true;
       int it = inObj;
      if (boolObj instanceof Boolean)
      {
      boolean b = (Boolean)boolObj;
        System.out.println(b);
      }
   }
}

2基本类型和字符串间的转换
(1)字符串类型转化为基本类型
利用包装类提供的parseXxx(String str)静态方法(除了character类,其他包装类都提供了该方法)
利用包装类提供的valueOf(String str)静态方法
1)基本类型转化为字符串类型
String也提供了多个重载valueOf()方法,将基本类型变量转换为字符串类型
直接将基本类型与基本类型相加也会使基本类型自动转换为字符串类型

public class Primitive2String
{
   public static void main(String[] args)
   {
      String intStr = "123";
      //把一个字符串转化为int类型
      int it1 = Integer.parseInt(intStr);
      int it2 = Integer.valueOf(intStr);
      System.out.println(it2);
      String floatStr = "4.56";
      //把一个字符串转化为float类型
      float ft1 = Float.parseFloat(floatStr);
      float ft2 = Float.valueOf(floatStr);
      System.out.println(ft2);
      //把一个float类型转化为字符串类型
      String ftStr = String.valueOf(2.345f);
      System.out.println(ftStr);
       //把一个double类型转化为字符串类型
      String dbStr = String.valueOf(3.344);
      System.out.println(dbStr);
       //把一个boolean类型转化为字符串类型
      String boolStr = String.valueOf(true);
      System.out.println(boolStr.toUpperCase());
   }
}

3比较
(1)包装类的实例与数值进行比较
直接取出包装类实例所包装的数值来进行比较
(2)包装类实例(引用类型)间的比较
只有两个包装类实例引用同一个对象时才会返回ture
可能会出现下面特别情况:

//通过自动装箱,允许把一个基本数据类型赋值给包装类
Integer ina = 2;
Integer inb = 2;
System.out.println("两个2自动装箱后是否相等:" + (ina == inb));//输出true
Integer biga = 128;
Integer bigb = 128;
System.out.println("两个2自动装箱后是否相等:" + (biga == bigb));//输出false

可能很让人费解,同样是两个int类型装箱后,结果出现不同的结果。
其实这与java的Integer类的设计有关。

系统把一个-128~127之间的整数自动装箱成Integer实例,并放入了一个名为catch数组中缓存起来。如果以后把一个-128–127之间的整数自动装箱成一个Integer时,实际上是直接指向对应的数组元素,因此-128–127之间的同一个整数自动装箱成Integer时永远都是引用catch数组中的同一个元素,因此他们相等。但每次把一个不在-128–127范围内的数装箱时,总是新建一个Integer实例。

Java7增强了包装类的功能,为所有包装类提供了一个静态放方法
compare(xxx val1 , xxx val2)用于比较两个基本类型变量的大小(布尔类型 ture>false)
Java8为Integer , Long增强了功能如下:

  1. static String toUnsignedString(int / long i)将指定的int/long转化为无符号整数对应的字符串
  2. static String toUnsignedString(int / long i , int radix)将指定的int/long转化为指定进制的无符号整数对应的字符串
  3. static xxx parseUnsignedXxx(String s)将指定字符串解析为无符号整数(当调用类为Integer时,xxx为int 当调用类为Long时,xxx为long)
  4. static xxx parseUnsignedXxx(String s ,int radix)将指定的字符串按指定进制解析成无符号整数
  5. static int compareUnsigned(xxx x , xxx y)将两个整数类型转化为无符号整形后比较大小。

猜你喜欢

转载自blog.csdn.net/qq_43215734/article/details/85203140
今日推荐