起因
今天在lintcode上刷题, 131. 大楼轮廓,提交后,结果错误,而且错的无法理解。问题出在一个if判断,代码如下。
//总为false
if(mList.get(i+j)==mList.get(i))
{
end = i+j;
}
else
{
i=i+j-1;
break;
}
mList为 List ; i ,j为int
运行发现,无论如何,if判断的结果都为false。但是打印结果,两个值都是288。中间使用两个变量倒一下,就可以得出正常结果。而且当两个值都为100的时候,无论哪种写法都可以得到正确结果。
//可以得到正常结果
int a = mList.get(i+j);
int b = mList.get(i);
if(a==b)
{
end = i+j;
}
else
{
i=i+j-1;
break;
}
期初,我以为是网站的BUG,可是当我把程序拷贝到本地,使用本地的环境编译运行后,发现结果是相同的,才发现是我的问题。经过搜索,才发现原来Integer与int是两个东西。
类型
Java 中的数据类型分为基本数据类型和引用数据类型
int是基本数据类型,Integer是引用数据类型
Ingeter是int的包装类,int的初值为0,Ingeter的初值为null;
自动装箱和拆箱
A. 自动装箱:将基本数据类型封装为对象类型,成为一个对象以后就可以调用对象所声明的所有的方法。
Integer inA = 127;
//以上的声明就是用到了自动的装箱:解析为Integer inA = new Integer(127);
B. 自动拆箱:将对象重新转化为基本数据类型。
//装箱
Integer inB = 128;
//拆箱
int inC = inB;
C. 自动拆箱很典型的用法就是在进行运算的时候:因为对象不能直接进行运算,需要转化为基本数据类型后才能进行加减乘除。
Integer inD = 128;
System.out.println(inD--);
为什么100可以“==”,288就不可以“==”
这是因为Java对于Integer 与int 的自动装箱与拆箱的设计,是一种模式:享元模式(flyweight),为了加大对简单数字的重利用,Java定义:在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象。而如果超过了这之间的值,被装箱后的Integer 对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象;
以上的现象是由于使用了自动装箱所引起的,如果你没有使用自动装箱,而是跟一般类一样,用new来进行实例化,就会每次new就都一个新的对象;这个的自动装箱拆箱不仅在基本数据类型中有应用,在String类中也有应用。
附:java中的包装类
基本数据类型包装类享元范围
bytejava.lang.Byte-128~127
booleanjava.lang.Boolean--
shortjava.lang.Short-128~127
charjava.lang.Character0~127
intjava.lang.Integer-128~
java.lang.Integer.IntegerCache.high
longjava.lang.Long-128~127
floatjava.lang.Float--
doublejava.lang.Double--