在初学Java时我们接触到的都是一些基本的数据类型,比如int , float,double等。但是对于高等语言JAVA等面向对象的语言来说,一切都是对象。如此看来这些基本数据类型显得就有些‘单薄’--------它只有一个值。这点令我们在面向对象编程时多少有些不适。因为我们考虑的对象是方法和属性的集合。基于此,这些基础数据类型的包装类就产生了。
二者之间的关系:
(1)包装类和基本数据类型相对应。除了8大基本数据类型的包装类外还有两个BigInteger和BigDecimal。通常用在科学计算中,也就是如果你的数子大于2(31)括号内为平方,不妨用下这个。用法可以参考基本数据类型。这两个包装类前者是整型后者是实数类型。
(2)包装类声明的是一个引用,基本数据类型是值。这是最大的区别,因为我们操作对象其实都是在操作对象的一个引用。举一个最常用的java集合类HashSet里面存储的都是引用。
public static void main(String[] args){
Set aset=new HashSet(); //这里存储的都是引用,另外注意这里的Integer泛型,也表明HashSet内部必须是对象。
Integer a=200; //很奇怪这里并不是一个创建类对象最常用的方式?没错,Java实现了对应类型之间的自动转换,谓之曰:自动封箱
Integer b=200;
System.out.println(a==b);//这里输出的是false??
aset.add(3);//自动将3封箱成Integer对象
System.out.println(a.compareTo(2)); //a为对象有方法可以调用,如果为基本数据类型,则什么都没有。
System.out.println( a.toString()); //Integer类型的方法,很方便。
}
上面的语句明明相等,为什么还会是false呢?换成100,输出true了?原来这里Integer类中有一个缓存机制,设计者认为通常-128--127之间的数为常用数字,如果你用上面的方式来使用这些类则在上述区间内系统还是会把它当成基本数据类型来对待,不会自动装箱为一个对象;如果你用Integer a=new Integer(100)的使用方式,就是在明确告诉系统忽略数字大小直接给我生成一个新的对象,我们知道对象是基于引用。引用地址不同自然数就不同。所以这种使用方式之间的比较无论数字大小,一律false。关于缓存的一些机制信息请参阅http://blog.sina.com.cn/s/blog_7ffb8dd5010123lt.html。比较其实比较的依然是地址,但是缓存机制的存在使得可以节省空间。比如大量运算中只涉及到某一值时缓存机制省去了不停开辟新地址,创建新对象的麻烦。
在java中除了Integer有缓存机制同样的缓存机制类型还有Short,Byte,Character,Long。浮点型没有该机制,这种使用机制多采用类似Integer a=Integer.valueOf(200)的方法。
大小范围除Character为0-127外其余均为-128--127.
public static void main(String[] args){
Integer a=Integer.valueOf(100);
Integer a1=Integer.valueOf(100);
System.out.println(a==a1);
Character b=Character.valueOf('c');
char b1='c';
System.out.println(b1==b);
Byte c=Byte.valueOf((byte) 100);//这里value内的值必须是byte类型,必须强制转换类型,否则出错。byte数据类型在处理网络或文件数据流时特别有用。
Byte c1=Byte.valueOf((byte) 100);//对于byte总有种既熟悉又陌生的感觉,如果谁有这方面介绍的资料请贴在评论处,感激不尽。
System.out.println(c==c1);
}
输出结果全部为true。