6.1 Java8增强的包装类
6.1 Java8增强的包装类
8种基本数据类型不支持面向对象
Jaa
是面向对象的编程语言,但它也包含了8种基本数据类型,这8种基本数据类型不支持面向对象的编程机制,基本数据类型的数据
也不具备”对象”的特性:没有成员变量、方法可以被调用。
所有的引用变量都可以当成Object类的引用变量使用
所有引用类型的变量都继承了Object
类,都可当成Object
类型变量使用。但基本数据类型的变量就不可以
包装类的引入
为了解决8种基本数据类型的变量不能当成Object
类型变量使用的问题,Java
提供了包装类(Wrapper Class
)的概念,为8种基本数据类型分别定义了相应的引用类型,并称之为基本数据类型的包装类
。
基本数据类型和包装类的对应关系
基本数据类型和包装类的命名规则
除**int
和char
有点例外之外,其他的基本数据类型对应的包装类都是将基本数据类型首字母大写即可**
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
对象。
字符串类型的值转为基本类型类型的值
包装类还可实现基本类型变量和字符串之间的转换。把字符串类型的值转换为基本类型的值有两种方式。
- 利用包装类提供的
parseXxx(String s)
静态方法(除Character
之外的所有包装类都提供了该方法) - 利用包装类提供的
valueOf(String s)
静态方法。
基本类型变量转为字符串
String
类提供了多个重载valueOf()
方法,用于将基本类型变量转换成字符串.- 将基本类型变量和空字符串(
""
)进行连接运算,则系统自动把基本类型变量转换成字符串
包装类对象可以直接和基本类型直接比较
包装类的实例可以与数值类型的值进行比较,这种比较是直接取出包装类实例所包装的数值来进行比较的。
比较两个包装类对象的值
两个包装类的实例进行比较的情况就比较复杂,因为包装类的实例实际上是引用类型,只有两个包装类引用指向同一个对象时才会返回true
。
如果要比较两个包装类对象的值,需要先转成基本类型再比较
。不能直接使用==
运算符直接比较.(因为对于基本类型”==
“比较的是值,对于引用类型,==
比较的是两个引用变量是否指向同一个对象。)
系统会自动缓存负128到127的Integer对象
系统自动缓存负128
到正127
之间的Integer
对象,当自动装箱的int变量的值在负128
和正127
之间时,将直接返回缓存好的Integer对象,不会创建新的Integer
对象.
Integer缓存引起的问题
对于两个在负128
和正127
之间int
类型的变量a
和b
,如果a
和b
相等,则a
和b
自动装箱后得到的是同一个Integer
对象.
由于是同一个Integer
对象,所以这两个对象的引用变量通过==
运算符比较将得到true
1 | // 通过自动装箱,允许把基本类型值赋值给包装类实例 |
java版本对包装类的增强
Java7后通过包装类的compare来比较对于基本类型的大小
Java7
增强了包装类的功能,Java7
为所有的包装类
都提供了一个静态的compare(基本类型 变量1, 基本类型 变量2)
方法,这样开发者就可以通过包装类提供的compare
方法来比较两个基本类型值
的大小
包括比较两个boolean
类型值,两个boolean
类型值进行比较时,true>false
。
Java7为Character包装类增加了大量工具方法
不仅如此,Java7
还为Character
包装类增加了大量的工具方法来对一个字符进行判断。关于Character
中可用的方法请参考Character
的API
文档。
java8增加无符号运算
Java8
再次增强了这些包装类的功能,其中一个重要的增强就是支持无符号算术运算。Java8
为整型包装类增加了支持无符号运算的方法。Java8
为Integer
、Long
增加了如下方法。
无符号运算方法 | 描述 |
---|---|
static String toUnsignedString(int或者long i) |
该方法将指定int 或long 型整数转换为无符号整数 对应的字符串。 |
static String toUnsignedString(int或者long i, int radix) |
该方法将指定int 或long 型整数转换为指定进制 的无符号整数对应的字符串 |
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
还为Byte
、 Short
增加了toUnsignedInt
、 toUnsignedLong
两个方法,这两个方法用于将指定byte
或short
类型的变量或值转换成无符号的int
或long
值。
无符号整数的特点
无符号整数最大的特点是最高位不再被当成符号位,因此无符号整数不支持负数,其最小值为0