关于java中JDK5的打包,拆包以及"=="和equals的问题

我们知道,JDK1.5中,增加了一个新的特性之一,就是自动装包和拆包,是的,正是这个新的特性,使得我们很多程序员在进行原型数据和对象数据类型比较的时候,能够很方便的进行.但是,正是应为这样,我们的问题往往出现在我们难以预料的地方.

   很多时候,我们对于数字,比如123和343的比较,都使用数学符号进行比较,比如使用"=="这个比较,这这是没有任何错误的,可是,这样的比较是没有意思,因为我们都知道谁大谁小,我们的比较往往是一些未知的东西,也就是通过变量来进行比较的,如下:

      Integer a=100;

   Integer b=100;

这样,我们比较两个变量a==b,这肯定是成立,我们的很多程序员会很自然的说出,这个结果是正确的,是的,这是没有任何的疑问.但是,如果我们把结果换成下面的形式

      Integer a=1232;

   Integer b=1232;

如果我们再用"=="进行比较,会得到什么样的结果呢?

  哈哈,我想,现在可能会有三个答案,正确,错误和不知道,

  让我们来分析分析,到底谁的结果是正确的呢?因为上面的是所有结果,我们也就只能从上面选出我们的答案了.

  首先,我们要明白,Integer是什么类型的,毫无疑问,是对象类型,但是,对象是需要使用new操作符来完成的啊,也就是 Integer a = new Integer(1232),这样才是我们的对象声明方式.

   如果是这样,那么我们应该明白,这个Integer a = new Integer(1232)的含义了,它的工作机制是什么,我们也应该明白吧,如果不明白,那么我们的错误就很难找出来了.

   这个实例是有两层意思,一 a只是被声明的应用,没有任何数据,new Integer(1232)就告诉虚拟机,在某个内存地址中,存在了这样一个对象,对象的内容是1232,并且把这个对象放在内存中的某个堆中,a就是得到了这个堆的内存地址应用,而不是对象本身,当我们要使用对象的值的时候,就会通过a这个内存地址找到相应的数据区,然后把拿到这些数据.

    而在java中,"=="比较符和equals比较函数,它们比较的内容是不同的;"=="比较符,如果是对原型,int,long,short,char,boolean,byte,double,float这些的数值比较,是不会出现任何疑问的,但是,对于对象就不一样了,"=="比较符,比较对象的时候,比较的是它的两个内存地址,而不是内存地址里面的值.

     说到这里,我们有些人会问,上面的比较

        Integer a=100;

        Integer b=100;

    a==b 为什么会成立?比较不是内存地址吗?它们是值相同的两个不同对象啊!

   哈哈,这个问题我们就得看看JDK1.5中自动装包和拆包的缘故了.自动装包就是编译器自动的把原型数据转换成对象类型,而java虚拟机根本就不知道这一个过程的变换,java虚拟机只会执行编译器生成的字节码,而编译器把原型编译成的对象到底放在那个位置呢?它们会把数值相同的数据编译成同一个对象存放起来吗?这就是我们解决问题的关键所在.

   java编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,char<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中,这下,我们就明白了,为什么使用等号比较两个大于127或者小于-128的Integer类型结果是false了吧?

   所以,从上面的分析中,我们应该明白,在java的比较中,当我们遇到比较两个对象的值是否相等时,我们应该使用equals这个函数,而不是"=="比较符,equals比较的是两个对象里面的值,也就是就是根据内存地址来找到堆中的数据.

 

   下面,我们再把这几个概念说一下

   自动装包:JDK1.5中,java编译器会自动的把原型包装称为对象类型,每一个原型都有自己对应的包装类型.把原型包装成对象类型的过程叫做自动装包.

  自动拆包:就是把对象类型的数据转换成原型的过程.

    "==":这个比较符比较的是两个原型数据

    equals:比较的是两个对象的值,是在对象中使用的,当遇到对象的时候,不需要作为任何考虑,就使用它.

 

 

   很多会问,我们什么时候使用原型,什么时候使用对象类型,这个问题,需要在实际的开发中来阐述,我在一些开发中就遇到这样的问题,在这里,我就不总结了,如果需要知道的,请告诉我或者在以后的日子中,我会陆续贴出来.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值