6.1 Java8增强的包装类

6.1 Java8增强的包装类

8种基本数据类型不支持面向对象

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

所有的引用变量都可以当成Object类的引用变量使用

所有引用类型的变量都继承了Object类,都可当成Object类型变量使用。但基本数据类型的变量就不可以

包装类的引入

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

基本数据类型和包装类的对应关系

这里有一张图片

基本数据类型和包装类的命名规则

除**intchar有点例外之外,其他的基本数据类型对应的包装类都是将基本数据类型首字母大写即可**

JDK1.5之前 基本数据类型变成包装类对象

JDK1.5以前,把基本数据类型变量变成包装类实例需要通过对应包装类的valueOf()静态方法来实现。

JDK1.5之前 包装类对象转基本数据类型

JDK1.5以前,如果希望获得包装类对象中包装的基本类型变量,则可以使用包装类提供的xxxValue()实例方法。
JDK1.5之后由于这种用法已经过时。
这里有一张图片

自动装箱 自动拆箱

为了消除基本类型变量和包装类对象之间的烦琐转换过程,JDK1.5提供了自动装箱(Autoboxing)和自动拆箱(AutoUnboxing)功能

什么是自动装箱

所谓自动装箱,就是可以把一个基本类型变量直接赋给对应的包装类变量,或者赋给Object变量,因为Object是所有类的父类,所以子类对象可以直接赋给父类变量;

什么是自动拆箱

自动拆箱则与之相反,允许直接把包装类对象直接赋给一个对应的基本类型变量

自动装箱时注意类型匹配

进行自动装箱和自动拆箱时必须注意类型匹配,例如Integer只能自动拆箱成int类型变量,不要试图拆箱成boolean类型变量;
与之类似的是,int类型变量只能自动装箱成Integer对象(即使赋给Object类型变量,那也只是利用了Java的向上自动转型特性),不要试图装箱成Boolean对象。

字符串类型的值转为基本类型类型的值

包装类还可实现基本类型变量和字符串之间的转换。把字符串类型的值转换为基本类型的值有两种方式。

  1. 利用包装类提供的parseXxx(String s)静态方法(除Character之外的所有包装类都提供了该方法)
  2. 利用包装类提供的valueOf(String s)静态方法。

基本类型变量转为字符串

  1. String类提供了多个重载valueOf()方法,用于将基本类型变量转换成字符串.
  2. 将基本类型变量和空字符串("")进行连接运算,则系统自动把基本类型变量转换成字符串

这里有一张图片

包装类对象可以直接和基本类型直接比较

包装类的实例可以与数值类型的值进行比较,这种比较是直接取出包装类实例所包装的数值来进行比较的。

比较两个包装类对象的值

两个包装类的实例进行比较的情况就比较复杂,因为包装类的实例实际上是引用类型,只有两个包装类引用指向同一个对象时才会返回true

如果要比较两个包装类对象的值,需要先转成基本类型再比较。不能直接使用==运算符直接比较.(因为对于基本类型”==“比较的是值,对于引用类型,==比较的是两个引用变量是否指向同一个对象。)

系统会自动缓存负128到127的Integer对象

系统自动缓存负128正127之间的Integer对象,当自动装箱的int变量的值在负128正127之间时,将直接返回缓存好的Integer对象,不会创建新的Integer对象.

Integer缓存引起的问题

对于两个在负128正127之间int类型的变量ab,如果ab相等,则ab自动装箱后得到的是同一个Integer对象.
由于是同一个Integer对象,所以这两个对象的引用变量通过==运算符比较将得到true

1
2
3
4
5
6
7
8
9
// 通过自动装箱,允许把基本类型值赋值给包装类实例
Integer ina=2;
Integer inb =2;
//-128<=2<=127 ina和inb是同一个对象,所以输出true
System.out.println("两个2自动装箱后是否相等:"+(ina==inb);
Integer biga =128;
Integer bigb =128;
//-128<=128<=127 不成立 ina和inb不是同一个对象,所以输出false
System.out. println("两个128自动装箱后是否相等:"+(biga==bigb));

java版本对包装类的增强

Java7后通过包装类的compare来比较对于基本类型的大小

Java7增强了包装类的功能,Java7所有的包装类都提供了一个静态的compare(基本类型 变量1, 基本类型 变量2)方法,这样开发者就可以通过包装类提供的compare方法来比较两个基本类型值的大小

包括比较两个boolean类型值,两个boolean类型值进行比较时,true>false

Java7为Character包装类增加了大量工具方法

不仅如此,Java7还为Character包装类增加了大量的工具方法来对一个字符进行判断。关于Character中可用的方法请参考CharacterAPI文档。

java8增加无符号运算

Java8再次增强了这些包装类的功能,其中一个重要的增强就是支持无符号算术运算Java8为整型包装类增加了支持无符号运算的方法。Java8IntegerLong增加了如下方法。

无符号运算方法 描述
static String toUnsignedString(int或者long i) 该方法将指定intlong型整数转换为无符号整数对应的字符串。
static String toUnsignedString(int或者long i, int radix) 该方法将指定intlong型整数转换为指定进制的无符号整数对应的字符串
static xxx parseUnsignedXxx(String s) 该方法将指定字符串解析成无符号整数
static xxx parseUnsignedXxx(String s, int radix) 该方法将指定字符串按指定进制解析成无符号整数
static long divideUnsigned(long dividend, long divisor) 该方法将x、y两个整数转换为无符号整数后,计算它们相除的商。
static long remainderUnsigned(long dividend, long divisor) 该方法将x、y两个整数转换为无符号整数后计算它们相除的余数.

当调用类为Integer时,xxx代表int;当调用类是Long时,xxx代表long

Java8还为ByteShort增加了toUnsignedInttoUnsignedLong两个方法,这两个方法用于将指定byteshort类型的变量或值转换成无符号的intlong值。

无符号整数的特点

无符号整数最大的特点是最高位不再被当成符号位,因此无符号整数不支持负数,其最小值为0