java包装类:Boolean,Byte,Short,Character,Integer,Long,Float,Void
包装类的自动装箱,自动拆箱
自动装箱:每当需要一种类型的对象时,这种基本类型就自动地封闭到与它相同类型的包装中
自动拆箱:每当需要一个值时,被装箱对象中的值就被自动提取出来
例子:
Integer b=127时,并没有new出一个新对象,而是共享了a这个对象的引用。
一些常用的方法:
Integer obj=new Integer(145)
new Integer("-45.36")
obj.toString()
obj1.equals(obj2)
obj.hashCode();
Integer.parseInt(args[0])
obj.intValue();
包装类的自动装箱,自动拆箱
自动装箱:每当需要一种类型的对象时,这种基本类型就自动地封闭到与它相同类型的包装中
自动拆箱:每当需要一个值时,被装箱对象中的值就被自动提取出来
int i=11;
Integer j=i;//自动装箱
int k=j;//自动拆箱
Integer a=100;相当于如下
Integer a=Integer.valueOf(100);
例子:
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer a=100;
Integer b=100;
Integer c=200;
Integer d=200;
System.out.println(a==b);//true 同一个对象的引用
System.out.println(c==d);//false >128 new一个新对象
System.out.println(a==100);//true 基本类型比较
System.out.println(d==200);//true 基本类型的比较
}
为什么第二个c==d的结果是false,而第一个a==b的结果是true。
原来
在jdk中源码中valueOf方法是这样的:public static Integer valueOf(int i){
final int offset=128;
if(i>=-128 && i<=127){
return IntegerCache.cache[i+offset];
}else{
return new Integer(i);
}
private static class IntegerCache{
private IntegerCache(){}
static final Integer cache[]=new Integer[-(-128)+127+1];
static{//statoc只能初始化一次,在对象间共享,即不同的对象共享同一个static数据
for(int i=0;i<cache.length;i++){
cache[i]=new Integer(i-128);
}
}
}
}
IntegerCache类中有一个数组缓存了值从-128到127的Integer对象
上例中Interger c=200相当于c=Integer.valueOf(200);根据源码,200大于127,所以方法返回的是new Integer(200);所以这里c和d是不同的对象引用。
而Integer a=100相当于a=Integer.valueOf(100);根据源码,100小于127,返回了IntegerCache中的缓存中的一个值。
Integer a=127Integer b=127时,并没有new出一个新对象,而是共享了a这个对象的引用。