Java基本类型的包装类

    xiaoxiao2021-03-25  73

    一.为什么有基本类型包装类 1)Java中基本类型的包装类在各种数据类型间转换中使用的比较多。

    @Test public void convertToString() { int a = 100; String astr = Integer.toString(a); System.out.println(astr); Integer integerValue = new Integer(100); String testStr = integerValue.toString(); System.out.println(testStr); String intStr = String.valueOf(integerValue); System.out.println(intStr); String booleanStr = String.valueOf(true); System.out.println(booleanStr); }

    结果为

    100 100 100 true @Test public void convertToBase() { int intValue = Integer.parseInt("24"); System.out.println(intValue); }

    2)包装类可用于泛型,如:List 如果为:List 泛型必须是对象类型,不可以是基本类型,这时候就必须使用基本类型的包装类。 二.Integer包装类 Integer包装类中有一个隐藏较深的坑,一般比较难以发现,现在在这里着重说一下:现在需要比较连个Integer类型的值 Integer a=intValue; Integer b=intValue; if(a==b){ //do something; } 这里intValue为一个整数,如:123 这时,我们会发现intValue值相同时,do something程序段有时候会执行有时候不会,证明这里直接用==比较是不对的。因为Integer是普通对象类型,自然不能直接用==来比较该类中的属性value的值是否相等。只有基本类型可以直接用==比较。 但是为什么有时候用==比较又成功了呢。我们分析一下:

    @Test public void testEquals() { Integer a = 23; Integer b = 23; if (a == b) { System.out.println("Equals!!!"); } else { System.out.println("Equals个毛!!!"); } }

    程序1 输出

    Equals!!! @Test public void testNotEquals() { Integer a = 222; Integer b = 222; if (a == b) { System.out.println("Equals!!!"); } else { System.out.println("Equals个毛!!!"); } }

    程序2 输出

    Equals个毛!!!

    我们会发现两种情况的输出是相反的,只是改变了比较的数组大小而已,会什么会得到相反的输出呢?我们来调试下代码,一探究竟。

    @Test public void testEquals() { Integer a = 23; Integer b = 23; if (a == b) { System.out.println("Equals!!!"); } else { System.out.println("Equals个毛!!!"); } }

    我们进入这个方法进行单步调试 图1 图2 我们可以看到 在执行Integer a=23;时,会进入Integer包装类的valueOf方法。 然后,我们可以看到有一个内部类IntegerChache,我们看一下这个内部类

    private static class IntegerCache { static final int low = -128; static final int high; static final Integer cache[]; static { // high value may be configured by property int h = 127; String integerCacheHighPropValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if (integerCacheHighPropValue != null) { int i = parseInt(integerCacheHighPropValue); 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() {} }

    可以看到这个内部类里初始化了一个int数组,数组得值得范围在-128~127 ,也就是当数值在-128~127时, Integer a=value; value(-128~127)时,返回的是一个int值,而不是一个Integer对象。 一旦超出了这个范围就会返回一个Integer对象,记住,除了8种基本类型,其他一切都是对象类型。 即第一个程序是两个基本类型用==比较,当然是返回true的。 但是当两个普通对象引用用==比较时,必须两个应用指向堆中的同一个对象实例时,才会返回true;显然这里是两个对象实例相比较,所以第二个程序返回false; 上述实验告诉我们,当我们比较两个普通对象相等时,不要直接用==,这是错误的,非常不靠谱的!!!!!!!!再次重申,除了8种基本数据类型,其他的都是普通对象类型。我们比较普通对象时,一般都用该对象重写的equals来比较,而重写equals的时候,我们最好也要重写hashcode,特别是应在Map类型时,一定要重写hashcoe和equals,这样会提高程序的效率。

    转载请注明原文地址: https://ju.6miu.com/read-25963.html

    最新回复(0)