java int存在哪,Java Integer 与 int 的区别

起因

今天在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--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值