美文网首页
Integer和int

Integer和int

作者: 源来是你啊 | 来源:发表于2019-09-28 15: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优化失去作用,在线程数特别大时,效率会较低。

    相关文章

      网友评论

          本文标题:Integer和int

          本文链接:https://www.haomeiwen.com/subject/gbiquctx.html