Integer和int

2019-09-28  本文已影响0人  源来是你啊

1. Integer(int包装类)

1.1 介绍

Integer在java中,包装了基本类型int的值,此外还提供了许多的方法,使Integer与String相互转换。

1.2 Integer源码详解

/*
    部分Integer源码,可以看出Integer继承自Comparable接口,由此看一看出Integer可以比较大小
*/
public final class Integer extends Number implements Comparable<Integer> {
    // Integer类型
    public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
    // Integer的值
    private final int value;
    // 转字符串方法
    public static String toString(int i, int radix) {
        //...
    }
    // 将字符串转化为Int类型
    public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        //...
    }
    // int转换为Integer类型,其中IntegerCache.low = -128,  IntegerCache.high = 127
    // IntegerCache.cache是个数组,容量为(256),里面保存-128至127这256个Integer对象
    public static Integer valueOf(int i) {
        // 由这里可以看出,如果int值小于127 且大于-128,那么就会从IntegerCache,cache中获取
        // 而不是在new一个Integer对象
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        // 如果int值在这个范围之外,那么就会从内存中创建一个Integer对象
        return new Integer(i);
    }
}

1.3 Integer与int比较

1.Integer是int的包装类,而int是java的基本类型;

2.Integer必须实例化后才能使用,而int不需要;

3.Integer实际上是对象的引用即指针,实际上是指向new Integer这个对象,而int是直接存储数据;

4.Integer默认值是null,而int默认值为0;

扩展:

缓存机制:

上述IntegerCache是在jdk1.5版本后引入的,目的是节省内存和提升性能,实现对象重用(复用)。

而在其他基本类型中,也有此类的缓存机制,例如

ByteCache 用于缓存 Byte 对象
ShortCache 用于缓存 Short 对象
LongCache 用于缓存 Long 对象
CharacterCache 用于缓存 Character

对象Byte,Short,Long 有固定范围: -128 到 127。对于 Character, 范围是 0 到 127。除了 Integer 可以通过参数改变范围外,其它的都不行。

线程安全:AtomicInteger

java中自带线程安全的基本类型有:AtomicInteger, AtomicLong, AtomicBoolean, AtomicIntegerArray, AtomicLongArray

1.AtomicInteger类中有有一个变量valueOffset,用来描述AtomicInteger类中value的内存位置 。

2.当需要变量的值改变的时候,先通过get()得到valueOffset位置的值,也即当前value的值.给该值进行增加,并赋给next

3.compareAndSet()比较之前取到的value的值当前有没有改变,若没有改变的话,就将next的值赋给value,倘若和之前的值相比的话发生变化的话,则重新一次循环,直到存取成功,通过这样的方式能够保证该变量是线程安全的

4.value使用了volatile关键字,使得多个线程可以共享变量,使用volatile将使得VM优化失去作用,在线程数特别大时,效率会较低。

上一篇下一篇

猜你喜欢

热点阅读