包装类
在java中并不是所有变量都是类,java存在着基本数据类型,在很多时候,我们需要将基本数据类型转化为对象,这个时候就需要包装类
基本数据类型 | 包装类 | 位数 |
---|---|---|
byte | Byte | 8 |
boolean | Boolean | 8 |
short | Short | 16 |
int | Integer | 32 |
long | Long | 64 |
float | Float | 32 |
double | Double | 64 |
char | Character | 16 |
我们这里就用Integer这个类为例,来看一下包装类的源码
Number
Integer继承自Number类,并且实现了comparable接口
public final class Integer extends Number implements Comparable<Integer>
点开Number的继承结构,我们看到有很多的数值相关的类都是继承自Number,所以我们先来瞅一眼这个Number类
Number类中的方法很简单,这几个方法分别返回数值的int,long,float,double,byte以及short表示,并且intValue(),longValue(),floatValue(),doubleValue()这几个还是抽象方法,所以继承自Number的数值类,均可以用这几个方法返回该数值的不同表示
Integer
回到Integer类,一眼就看到定义的最大值和最小值
所以Integer的最大值为
2
31
−
1
2^{31}-1
231−1,数值为2,147,483,647,最小值是-
2
31
2^{31}
231,数值为-2,147,483,648
valueOf是个编程经常要用到的方法,一般我们用它将int基本类型或者字符串转换为包装类Integer,java的自动装箱也是调用的valueOf方法
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10)); // parseInt方法将字符串数值转换为int值
}
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
与我们设想不太一样的地方是,在valueOf这个常用方法中,我们看到了一个叫做IntegerCache的东西,这个究竟是什么东西呢?
在代码里面找到了IntegerCache这个静态私有类
private static class IntegerCache
这个类里面建了一个cache数组,类型是Integer,在这个数组里面存有值为-128到127的Integer类的实例,如果调用valueOf方法时,所取的值在这个范围里面,那么就可以直接从cache里面拿取相应的类,而不用新new一个,从而减小开销
看到Byte,Short和Long里面都做了类似的处理,所以只要看看Integer就可以对其他的数值包装类做对比
贴一下看看Long里面的cache实际代码,就是一个非常简单的数组构造
private static class LongCache {
private LongCache(){}
static final Long cache[] = new Long[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Long(i - 128);
}
}
重写的equals方法
// 重写了equals方法,比较数值
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Integer源码看到这里结束了,其他的包装类均可以通过类比的方式了解里面的大概