Long 的== 与equals

遇到一个关于Long的问题,
Long i = 130L;
经过网络传输后,在jboss中执行
Long b = 130L;
i == b 判断时竟然没有返回true, 关于Long的自动装箱以前也看到过相关的东西,只是没有想到会被自己碰到。
经过测试java在对Long类型进行序列话的时候应该是根据基本类型来做的;在上面的执行程序应该可以等价如下:
Long i = Long.valueOf(130);//这个过程中会自动装箱,本身缓存-128--127中间的数字,其他会重新new

在网络传输的时候之前:
bef = Long.longValue();
objectOutputStream.writeLong(bef);

传输之后
long ret = objectInputStream.readLong();
Long i = Long.valueOf(ret); //同样不会自动装箱,重新new出来
Long b = Long.valueOf(130); //
i == b //false;

由此得出两个结论:
1、Long类型的比较,对于在-128-----127之间的数字,==,和equals比较是等价的,而对于不再这个范围的数字,比较应以equals为准。
2、Long类型,虽然实现了Serializable接口,但是其本身并不参与序列化,在序列话之前,将Long类型的数字转换为基本类型。在序列化之后,将基本类型转换为对应的包装类型。

猜测,所谓的自动装箱,也就是在必要的时候,自动调用Number类型中的,valueOf(long、int、float、double)等方法,在需要的时候,又会转换为基本类型。。。

问题: java本身并不是完全的面向对象的语言,在1.5之后添加了自动装箱机制,这里引入这个东西的原因是什么呢?  仅仅是为了统一? 还是有其他考虑。
目前感觉包装类型的好处有,能够通过null判断是不是付过值,其他没有发现什么好处    





你可能感兴趣的:(equals)