[转]java中的比较运算符== 与 equals()方法

上一篇 / 下一篇  2016-09-30 17:20:22 / 个人分类:其它

JAVA中变量分为两类,一类是值类型,它储存的是变量真正的值,比如基础数据类型,值类型储存在内存的中;一类是引用类型,他们储存的是对象的地址,而该地址所对应的内存空间储存的才是我们需要的内容,比如字符串,对象等,储存在内存中的中。


首先==运算符比较的是值类型,(如果比较两个引用类型,比较的就是他们的引用地址)而equals()方法只能用来比较引用类型(就是引用的内容)。


说一下两者的区别:

==运算符:

==比较的是左右两边的变量是否来自同一个内存地址。

如果比较的是值类型(如基础数据类型,int char什么的)的话,由于值类型是存储在栈里面的,当两个变量有同一个值时,其实他们只用到了一个内存空间,所以比较的结果是true。

比如

int a=1;

int b=1;

a==b的结果就是true了,因为a和b用的都是栈里面某个内存空间,它的值为1。

如果==比较的是引用类型,则比较的是两个引用类型变量引用的地址,这时就要看两个变量是否引用自同一个地址的内存了。

最典型的问题就是两个String的问题

例如:

例子1:

String s1="123";

String s2="123";

这里s1==s2的结果是true

但是如果

例子2:

String s1="123";

String s2=new String("123");

这里s1==s2的结果是false;

为什么结果会不同呢,这里还要涉及到java中字符串缓冲池的问题。

java中有字符串缓冲池的概念,通俗的说,就是有个池子,里面放了字符串对象,如果下次申请的新的字符串在池子里已经有了,那就直接把池子里已经有的字符串对象的地址给新的字符串变量,因此池子里原来有的字符串的那个变量和新申请的变量,其实指向的是同一个内存空间。因此例子1里面s1和s2用到的都是同一个内存空间的“123”。所以此时==的结果是true。

再说例子2,由于s2 用new 操作符重新申请了空间,没有用到缓冲池里的原有变量,因此s1和s2虽然对象的值都是“123”,但所属不同内存空间,所以==的结果为false。



最后再说到equals()方法:

eqluals()方法是Object类的基本方法之一,所以每个类都有自己的equals()方法,作用是比较两个对象是否是同一个,通俗的理解就是比较这两个对象内容一不一样,所以上面的两个例子如果改成equal()比较的话,结果都是true。


TAG: java equals

 

评分:0

我来说两句

Open Toolbar