疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java包装类详解


 

 
 
一、什么是java的包装类?
 
java是一种面向对象语言,java中的类把方法与数据连接在一起,并构成了自包含式的处理单元.但在java中不能定义基本类型(primitive type),为了能将基本类型视为对象来处理,并能连接相关的方法,java为每个基本类型都提供了包装类。
 
二、java包装类常用的几种类型
 
Boolean,Byte,Short,Character,Integer,Long,Float,Void
 
三、包装类都有共同的方法
 
带有基本值参数并创建包装类对象的构造函数.如可以利用Integer包装类创建对象,Integer obj=new Integer(145);
带有字符串参数并创建包装类对象的构造函数.如new Integer(“45”);
生成字符串表示法的toString()方法,如obj.toString().
对同一个类的两个对象进行比较的equals()方法,如obj1.eauqls(obj2);
生成哈稀表代码的hashCode方法,如obj.hasCode();
将字符串转换为基本值的 parseType方法,如Integer.parseInt(args[0]);
可生成对象基本值的typeValue方法,如obj.intValue();
四、包装类的自动装箱、自动拆箱
 
首先,什么是装箱与拆箱?最简单的解释就是把最简单的数据类型用他们相对应的引用类型包装起来,使他们具有对象的特性。例如基本类型int,它所对应的包装类就是Integer。装箱与拆箱就是int与Integer之间的转换。
 
为了使我们的操作更加简单,jdk1.5版本给我们提供了自动拆箱与自动装箱的功能。例如:
 
int i = 25;
Integer j = i;//自动装箱
int m = j;//自动拆箱
注意:对于Integer的拆装箱需要注意以下问题
 
public class Demo {
    public static void main(String[] args) {
        Integer a = 100;
        Integer b = 100;
        Integer c = 200;
        Integer d = 200;
        System.out.println(a==b);
        System.out.println(a==100);
        System.out.println(c==d);
        System.out.println(c==200);
    }
     
}
运行一下,结果依次为true,true,false,true
对于a==100,b==200大家应该可以理解,作了拆装箱,这里比较的是他们的值。但是a等于b为什么c就不等于d了?这就需要我们分析一下了
当Integer a = 100;这条语句执行的时候,java自动把它翻译成Integer a = Integer.valueOf(100);我们就来看一下valueOf这个函数:
public static Integer valueOf(int i) {     
    final int offset = 128;     
    if (i >= -128 && i <= 127) { // must cache     
        return IntegerCache.cache[i + offset];     
    }     
    return new Integer(i);     
}     
private static class IntegerCache {     
    private IntegerCache(){}     
    static final Integer cache[] = new Integer[-(-128) + 127 + 1];     
    static {     
        for(int i = 0; i < cache.length; i++)     
            cache[i] = new Integer(i - 128);     
    }     
}
这里看一下,当参数i是属于整型范围以内的就返回IntegerCache.cache[i]。对于IntegerCache的cache[],我们注意到static {}里面对它进行了初始化。new了所有的整型对象出来,而static{}只初始化一次,并且在对象间共享。因此,valueOf函数返回的是一开始就初始化好了的对象的引用。所以a和b都是同一个引用,因此它们相等。当然了,当参数大于127的时候,都是返回的新建对象,因此它们的引用并不等。所以说,对于Integer有特殊的地方,就是它使用了数组的缓存,目的是为了提高运行效率。