首页 > 编程 > Java > 正文

java之数据包装类和封装类于开发中的注意事项

2019-11-10 20:41:29
字体:
来源:转载
供稿:网友

  最近在开发中的时候,在使用数据比较的时候。总是出现预想之外的结果。排查的时候,很容易忽略 。经过一番深究,总算有点体会了!!

我们都知道在java中数据有8种基本数据类型及其包装类 

1、基本类型:byte 二进制位数:82、包装类:java.lang.Byte3、最小值:Byte.MIN_VALUE=-1284、最大值:Byte.MAX_VALUE=1275、6、基本类型:short 二进制位数:167、包装类:java.lang.Short8、最小值:Short.MIN_VALUE=-327689、最大值:Short.MAX_VALUE=3276710、11、基本类型:int 二进制位数:3212、包装类:java.lang.Integer13、最小值:Integer.MIN_VALUE=-214748364814、最大值:Integer.MAX_VALUE=214748364715、16、基本类型:long 二进制位数:6417、包装类:java.lang.Long18、最小值:Long.MIN_VALUE=-922337203685477580819、最大值:Long.MAX_VALUE=922337203685477580720、21、基本类型:float 二进制位数:3222、包装类:java.lang.Float23、最小值:Float.MIN_VALUE=1.4E-4524、最大值:Float.MAX_VALUE=3.4028235E3825、26、基本类型:double 二进制位数:6427、包装类:java.lang.Double28、最小值:Double.MIN_VALUE=4.9E-32429、最大值:Double.MAX_VALUE=1.7976931348623157E30830、31、基本类型:char 二进制位数:1632、包装类:java.lang.Character33、最小值:Character.MIN_VALUE=034、最大值:Character.MAX_VALUE=65535

这里以int和Integer来做说明。 2者之间最显著的区别在于Integer可以为null,而int不能。所以在开发中,多使用包装类作为方法的参数。

这时,如果用 == 比较2个Integer的值。就很容易出现问题了~~~~~~~~~~~~~

 Integer a = 5; Integer b = 5;

a == b  ---------> True

这里这2个包装类在使用的使用,因为2个值指向同一个对象。所以比较时是true,而输出时会自动拆箱,所以System.out.PRint(a)会 是 5 而不是一个地址(对象)

但是:

 Integer a = 500; Integer b = 500;

a == b  ---------> false

System.out.print(a)会 是一个地址(而不是500)

因为这时没有拆箱的操作。 在进行装箱的时候。通过源码可知 int类型的装箱拆箱的范围必须在[-128,127];

public static Integer valueOf(int i) {        if(i >= -128 && i <= IntegerCache.high)            return IntegerCache.cache[i + 128];        else            return new Integer(i);    }而其中IntegerCache类的实现为:
private static class IntegerCache {        static final int high;        static final Integer cache[];        static {            final int low = -128;            // high value may be configured by property            int h = 127;            if (integerCacheHighPropValue != null) {                // Use Long.decode here to avoid invoking methods that                // require Integer's autoboxing cache to be initialized                int i = Long.decode(integerCacheHighPropValue).intValue();                i = Math.max(i, 127);                // Maximum array size is Integer.MAX_VALUE                h = Math.min(i, Integer.MAX_VALUE - -low);            }            high = h;            cache = new Integer[(high - low) + 1];            int j = low;            for(int k = 0; k < cache.length; k++)                cache[k] = new Integer(j++);        }        private IntegerCache() {}    }从这2段代码可以看出,在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。

所以,在进行包装类比较的时候,如果拿不准数值的范围,最好手动拆箱成基本类型

 Integer a = 500; Integer b = 500;

a.intValue() == b.intValue()  ---------> True

System.out.print(a)会 是一个地址(而不是500)


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表