当我们在java编程中,我们常常会用到==与equals来比较我们所选中的对象,那么==与equals之间到底有什么异同呢?它们之间有什么区别呢?我们一起来看看。

首先我们要了解数据对象之间是怎么运行,余以为,在数据运行中,内存通常会分为堆内存和栈内存,在堆内存中的数据都是共享的,然后我们就可以推出在栈内存中的数据是私密的,我们在创建一个数据的同时,首先要看它的数据类型,我们的数据类型要分为基础数据类型和引用数据类型,当我们创建了基础数据类型时,那么在栈内存中就会创建出储存该内存的空间,而引用数据内存则是会在堆内存中创建出一个储存该数据的空间,而在栈内存中只会有该数据在堆内存中的地址编码。

我们首先来看双等号是如何来实现数据之间的比较的,在java中,==在进行数据的比较时都是对地址的比较,就是说他们比较的是我们比较的对象在栈内存中所储存的数据,那我们就可以看出来当我们比较的是基础数据类型时,电脑会直接调用两个对象储存在栈中的数据进行比较,而是引用数据时,比较他们在栈中的数据,则是比较他们储存在栈内存中的地址编码,而当我们创建不同的类时,他们在堆空间中的内存地址显然是不同的,所以==在这里显然就不能用了。

而在equals中,显然就不同了,通过对equals的源代码的阅读可以知道,equals的判断,首先是对他们地址的判断,如果他们地址一样那么自然也会一样,输出true,如果地址不同则会进行下一步的判断,直到最后会将他们变成字符型而一个个进行比较,这样做显然可以节省一部分情况的时间,同时这样做也可以看出来比==的适用性更强。

所以我们一般用equals的情况更多一点,因为==的不确定性太强,那么==在字符中的比较比不过equals的话,那么在数字中又如何呢?

在这个方面,我们就有一个需要知道的另一个概念,即常量池,里面储存了许多常用的字符和数字,当我们为一个对象赋值的时候,

即x=xx时,首先会在常量池中搜索,如果有再将其赋值给变量,如果没有则重新创建一个,这个时候新创建的变量地址自然也就会不同,所以==判断就会输出false,那么在数字中的常量池内,则是固定了256个常量,所以当我们的数字超过这个范围,就会创建一个新的地址。==判断也会输出false了。