Java的原始类型自动包装与解包机制

java5之后对原始数据类型如int、char、long等基本数据类型有自动打包成相应的复合类型Integer、Character、Long等的机制;也可以将复合类型自动转换为原始类型。

这取决于程序要进行怎样的处理。如:

int i = 0;

Integer obj = i;

-----

Integer obj = new Integer(0);

int i = obj;

但是并不是所有的地方都会进行自动的打包和解包。

有些地方存在“陷阱”,不注意的话,会产生问题。如:

java.util包中的List接口有两个remove方法,一个接收int参数,表示删除指定位置的元素;一个接收Object参数,表示删除指定的元素(内部使用equals进行元素相等的判断)。

如果有一个List<Integer> list = new ArrayList<Integer>();

list.add(1);

list.add(2);

list.add(3);

如果你调用list.remove(0);表示删除的是位置0上的元素即1。

如果你调用list.remove(new Integer(0));表示删除要0这个元素,但是list中没有这个元素,因此list元素不会发生变化。

 

另外valueOf方法使得-128~high之间的数字都指向同一个引用。

  1. public static Integer valueOf(inti) {    
  2.     if(i >= -128 &&i <=IntegerCache.high)    
  3.        //如果i在-128~high之间,就直接在缓存中取出i的Integer类型对象  
  4.        return IntegerCache.cache[i + 128];    
  5.     else  
  6.        return new Integer(i); //否则就在堆内存中创建   
  7. }    

 

posted on 2016-08-30 22:29  dennyzhangtm  阅读(1507)  评论(0编辑  收藏  举报