提示:以下是本篇文章正文内容,下面案例可供参考
一、为什么要有包装类?
Java是面向对象的语言,但是Java不是纯面向对象语言,因为Java保留了C语言的8种基不数据类型和void.
int,,byte,short,long,boolean,float,double,char
这些类型不属于面向对象。
为什么要保留这些类型呢?
因为这些类型有丰富的运算符可以支持,而且这些类型有固定大小的内存空间。但是这些特性没必要重新再设计新的,所以Java就直接沿用至今。
但是Java除了这些以外又都是面向对象的,很多的API方法,或者新特性都是针对“对象”而设计的,比如:集合、泛型等,只支持对象,不支持基本数据类型。
Java为了解决这样的问题,希望基本数据类型的数据也能用于集合,也能使用一些新特性,就给它们提供了“包装类”。
基本数据类型 | 包装类类型 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
void | Void |
二、基本数据类型与包装类之间如何相互转换?
前文提到,尽管Java为基本数据类型设计了包装类,使之可以运用于集合等众多AP方法中,但基本数据类型和包装类毕竟是两种类型,是需要转换才能使用。
而这两者之间相互转换的操作被称为“装箱”与“拆箱”。
装箱:
基本数据类型的数据 -> 包装类的对象
拆箱:
包装类的对象->基本数据类型的数据
手动装箱演示如下
在JDK1.5之后,装箱和拆箱可以自动进行,非常方便
自动装箱演示如下
但是自动的装箱与自动的拆箱,只支持对应类型之间。
三、包装类常用方法
3.1 获取某个数据类型的范围
我们最常用的包装类是Integer,因此以下案例方法是以Integer作为参考,读者可依次类推其他包装类
包装类.MAX_VALUE :包装类的最大正有限值的常量
包装类.MIN VALUE:包装类的最小负有限值的常量
代码如下(示例):
3.2 将十进制的整数转换为其他进制的数
代码如下(示例):
//查看25这个十进制值的二进制、八进制、十六进制 //把25转为二进制 System.out.println(Integer.toBinaryString(25)); //把25转为八进制 System.out.println(Integer.toOctalString(25)); //把25转为十六进制 System.out.println(Integer.toHexString(25));
3.3 基本数据类型与String之间的相互转换
3.3.1 把基本数据类型转为字符串
3.3.2 把字符串转为基本数据类型
String转换成对应的基本类型,除了Character类之外,其他所有包装类都具有parseXxx静态方法可以将字符申参数转换为对应的基本类型,例如:
- public static int parseInt(string s): 将字符参数转换为对应的int基本类型
- public static long parseLong(string s): 将字符串参数转换为对应的long基本类型
- public static double parseDouble(String s): 将字符参数转换为对应的double基本类型.
或把字符串转为包装类,然后可以自动拆箱为基本数据类型
- public static Integer valueof(string s): 将字符参数转换为对应的Integer包装类,然后可以自动拆箱为int基本类型
- public static Long valueof(string s): 将字符参数转换为对应的Long包装类,然后可以自动拆销为lona其木米型
代码如下(示例):
3.4 字符转大小写
代码如下(示例):
Character.toUpperCase('x'); Character.toLowerCase('x') ;
3.5 比较
代码如下(示例):
Double.compare(double d1, double d2) Integer.compare(int x, int y)
返回值都是int类型,以上图第二句代码举例,如果x>y,返回1,如果x==y,返回0,如果x<y,返回-1;
四、包装类对象的特点
4.1 部分包装类有缓存对象
Byte: -128~127
Short: -128~127
Integer: -128~127
Long: -128~127
FLoat和Double不缓存
Character: -127 最原始的ASCII表范围字符串Boolean: true, false
为什么要有缓存对象 ?
如果每一次自动装箱,都产生新对象的话,那么会怎么样?-128~127范围内的数字在程序中出现的概率非常高,那么就会导致包装类对象泛滥。内存就很紧张考虑到这一点,就想着重复使用一些对象,这些对象被缓存起来,重复使用。例如: 1这个值对应的包装类对象,重复使用1个。
缓存对象是针对自动装箱的,new出来的不是缓存对象。
包装类.valueof()使用了缓存对象
附注:
java中基本类型的包装类的大部分都实现了常量池技术,即Byte,Short,Integer,Long,Character,Boolean。
这6种包装类默认创建了数值[-128,127]的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。 两种浮点数类型的包装类Float,Double并没有实现常量池技术。
4.2 包装对象不可变
代码如下(示例):
4.3 类型转换问题
代码如下(示例):
4.4 总结
== 比较
如果是包装类和基本数据类型之间(无论它们是否对应)都是先把包装类拆箱后,按照基本数据类型的比较规则进行。
如果都是包装类比较,那么要求必须是同一种类型之间比较。
五、总结
以上就是今天要讲的内容,本文仅仅简单介绍了包装类的相关知识及其使用,而其包装类则为我们提供了大量能使我们快速便捷地处理数据的方法。