首页 > 技术文章 > Integer学习感悟

donefive 2017-03-16 17:26 原文

摘要: 今天学习了一下String的源码。下面是我的学习感悟。

Integer是int的包装类,可以为null,

int不能为null,默认为0

1.

jdk中的源码定义如下:

public final class Integer extends Number implements Comparable<Integer>{
    
    private int value;
    private static final long serialVersionUID = 1360826667806852920L;
}

 这里,可以看出:

          Integer类是个final类,不能被继承。

    Integer继承了number类,拥有longValue(),doublevalue(),floatValue()的方法。

          Integer实现了Comparable接口,可以将Integer和Integer进行对比,返回true和false。

          Integer的内部属性是个int。这个int实际上就是Integer的值。

          serialVersionUID是序列化和反序列化的东东。

2.

Integer里面有很多静态属性:

//值为 (-(2的31次方)) 的常量,它表示 int 类型能够表示的最小值。
public static final int   MIN_VALUE = 0x80000000;
//值为 ((2的31次方)-1) 的常量,它表示 int 类型能够表示的最大值。
public static final int   MAX_VALUE = 0x7fffffff;   
//表示基本类型 int 的 Class 实例。
public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
//用来以二进制补码形式表示 int 值的比特位数。
public static final int SIZE = 32;
//用来以二进制补码形式表示 int 值的字节数。1.8以后才有
public static final int BYTES = SIZE / Byte.SIZE;

 我们可以直接调用这些属性。这样速度会更快,可读性也强。

3.

构造方法:

public Integer(int value){
    
    this.value = value;
}

public Integer (String s) throws NumberFormatException {

    this.value = praseInt(s,10);

}

 这个意思是,你可以这样写: Integer i = new Integer(5); 也可以写成 Integer i = new Integer("5");不过如果你传的是字符串,字符串会先转换成int,在创建Integer,并且你的字符串所代表的值只能是十进制的数。

4.

Integer.valueOf(int);

对于这个方法:曾经有个面试题是这么问的:

Integer i1 = Integer.valueOf(10);

Integer i2 = Integer.valueOf(10);

Integer i3 = Integer.valueOf(10);

请问,i1,i2,i3是不是同一个对象?

答案一定会出乎你的意料。 

如果我们把Integer i1 = Integer.valueOf(10)这句话进行反编译,则会得到下面的代码:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

 一般来说,IntegerCache.low = -128;IntegerCache.high = 127;IntegerCache会在Integer被引入的时候被赋值,当然我们也可以手动更改他们的值,让他们的范围更大。 当你创建一个-128到127的Integer的时候,我们会从缓存中将值取出已存在的对象。

所以刚刚的面试题的答案是:i1和i2和i3是同一个对象。

所以,我们在新建一个Integer的时候,要用Integer i = 10;或者Integer i = Integer.valueOf(10)这样的语句,少用Integer i = new Integer(10);

5.

String转换成Integer或者int的方法:

这些方法有很多:

Integer getInteger(String nm)
Integer getInteger(String nm, int val)
Integer getInteger(String nm, Integer val)
Integer decode(String nm)
Integer valueOf(String s)
Integer valueOf(String s, int radix)
int parseUnsignedInt(String s)
int parseUnsignedInt(String s, int radix)
int parseInt(String s)
int parseInt(String s, int radix)
但是这些方法的堆栈都是一样的:
getInteger(String nm) ---> getInteger(nm, null);--->Integer.decode()--->Integer.valueOf()--->parseInt()

 既然上面有这么多的方法,我们怎么选择:

praseInt()的结果是int

Integer.valueOf()返回的是Integer

如果与进制有关就用decode()

6.

int转String的方法:

这个方法你自己看吧,绝对超值。强烈推荐。 自己去百度

7.

compareTo()的方法,只能将Integer和Integer比较,类型不对会报错

public int compareTo(Integer anotherInteger) {
    return compare(this.value, anotherInteger.value);
}

 比较的是Integer.value的大小。

8.

实现Number类的方法:

public long longValue() {
    return (long)value;
}

public float floatValue() {
    return (float)value;
}

public double doubleValue() {
    return (double)value;
}

 

推荐阅读