Java知识点–包装类
Java作为一种面向对象的语言,但是他包含了8种基本数据类型,这8种基本数据类型不支持面向对象编程的机制:
1.基本数据类型的数据不具备“对象”的特性:没有成员变量,方法可以被调用
2.违背了Object作为所有类的父类的原则,即8个基本变量不可以被作为Object类型的问题
参考表:
基本数据类型 | 包装类 |
---|---|
btye | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
上述流程为jdk1.5之前尚未引入自动装箱/拆箱的写法,自jdk1.5之后,jdk引入引入自动装箱/拆箱,写法就简单多了
我们可以写形如 包装类 包装类对象=基本数据类型对象 的写法
但是值得强调的是:
包装类必须要与基本数据类型对应
下面介绍基本类型变量和String的转换
小技巧:
可以通过+""的方式转换为字符串
int a=0;
String parseByInt=a+"";
关于包装类的比较问题
//下面代码输出false
System.out.println(Integer.valueOf(2)==Integer.valueOf(2));
//有过基础的知道,Integer作为引用类型,==的实质是比较地址
再看一种情况
Integer a=2;
Integer b=2;
//下面代码输出true
System.out.println(a==b);
Integer ba=128;
Integer bb=128;
//下面会输出false
System.out.println(ba==bb);
看似相同的代码为什么比较结果大相径庭呢,我们阅读一下源码
static final Integer[] cache=new Integer[-(-128)+127+1];
static{
for(int i=0;i<cache.length;i++){
cache[i]=new Integer(i-128);
}
}
不难发现,当我们的数据在-128~127之间时,我们引用了jdk提供的一个数组,所以,打我们比较在这个范围之间的数字时,并未感觉有什么不同,但是,当我们比较不在这个范围的数字时,要当心了
其实,在jdk7之后,所有的包装类又提供了compare(xxx val1,xxx val2)方便我们去比较
对于Boolean(true>false)
jdk8之后,包装类Integer,Long,Byte,Short又多了新方法(无符号运算)
1.static String toUnsignedString(int/ong i);
2.static String toUnsignedString(int/ong i,int radix);(radix进制,下同)
3.static xxx parseUnsignedXxx(String s);
4.static xxx parseUnsignedXxx(String s,int radix);
5.static int compareUnsigned(xxx x,xxx y);
6.下面方法可以把Byte和Short转换为无符号的int或者long,这个方式会把最高位不作为符号位
toUnsignedInt(xxx x);
toUnsignedLong(yyy x);