您的位置:首页 > 编程语言

integer和long源代码解析

2018-07-29 01:17 246 查看
4000

一.简介

1.Integer和Long的联系与区别

2.源代码中的享元模式

3.常用的方法

二.Integer和Long的联系与区别

相同点: Ingeter和Long都是包装类,初值为null;

通过equals比较变量是否相同,==在一定的范围内可以使用(在以下享元模式中解释);

区别:Integer是int的封装类型是整数范围-2^31到2^31-1,long 的整数范围:-2^63 ~ 2^63 -1 long是长整型;

三.源代码中的享元模式

例子

Integer i=10;

Integer j=10;

System.out.println(i==j);

//这里输出是true

Integer a=200;

Integer b=200;

System.out.println(a==b);

//这里输出是false

 

答案很简单==判断的是两个变量引用的地址,Integer/Long源代码在设计中缓存了-128到127之间的值,所以在这个范围内的数值都是指向同一个地址;

 

源代码:

缓存的实现:

     //是Integer内部的私有静态内部类,里面的cache[]就是jdk事先缓存的Integer。
    private static class IntegerCache {
        static final int low = -128;//区间的最低值
        static final int high;//区间的最高值,后面默认赋值为127,也可以用户手动设置虚拟机参数
        static final Integer cache[]; //缓存数组
        static {
            // high value may be configured by property
            int h = 127;
            //这里可以在运行时设置虚拟机参数来确定h  :-Djava.lang.Integer.IntegerCache.high=250
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {//用户设置了
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);//虽然设置了但是还是不能小于127
                // 也不能超过最大值
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            }
            high = h;
            cache = new Integer[(high - low) + 1];
            int j = low;
            //循环将区间的数赋值给cache[]数组
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }
        private IntegerCache() {}
    }

这就是就是用一个Integer数组先缓存了-128到127区间值,后面如果是是在区间内的数直接从缓存数组中取,否则才构造新的Integer。

 

Integer赋值时:

public static Integer valueOf(int i) {

if (i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];//在缓存数组区间内返回缓存中的数据

return new Integer(i);//不再区间内new一个对象

}

 

四.常用的方法

1.类声明和变量

public final class Integer extends Number implements Comparable<Integer> {

final类不能被继承,继承了abstract类Number,实现了抽象方法有

intValue()、longValue()、floatValue()、doubleValue()、byteValue() 、shortValue()

 

实现Comparable接口用于比较两个变量大小,实现方法 compareTo(T o);

 

private final int value;//final证明不可变性 private static final long serialVersionUID = 1360826667806852920L;

从对象不可变知道以下i生成了两个对象

public static void main(String[] args) { Integer i = new Integer(6); i = 7; }

编译后的代码是

public static void main(String args[]) { Integer i = new Integer(6); i = Integer.valueOf(7);//生成对象或者从缓存中取数据 }

 

2.compareTo

public int compareTo(Integer anotherInteger) {

return compare(this.value, anotherInteger.value);

}

public static int compare(int x, int y) {

return (x < y) ? -1 : ((x == y) ? 0 : 1);//小于返回-1,大于返回1等于返回0

}

3. 类型Value以shortValue为例子,都是通过强转

public short shortValue() {

return (short)value;

}

4. equals

private final int value;//成员变量,Integer 的值

public boolean equals(Object obj) {

if (obj instanceof Integer) {

return value == ((Integer)obj).intValue();//转化成int基础类型再做比较,所以包装类采用//equals方法进行比较大小

}

return false;

}

 

就先写到这里了,以下是在资料整理时看到的一篇很详细的源代码解析:

https://www.geek-share.com/detail/2665229660.html

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: