[转]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。
相关阅读:
- 从面试题中看java的Reference(引用) (zaza9084, 2016-9-22)
- Selenium 1(Remote Control) (1094389572, 2016-9-22)
- Java中针对finalize的实现和相应的执行过程 (zaza9084, 2016-9-23)
- Java Fluent Restful API自动化测试框架 (zaza9084, 2016-9-23)
- Ctrl+H 在Eclipse中从所有的Java文件中查询某个关键字 (sll101010, 2016-9-26)
- 浅谈Java String内幕(上) (zaza9084, 2016-9-26)
- 浅谈Java String内幕(下) (zaza9084, 2016-9-27)
- JAVA要死了吗?不!我来告诉你为什么! (zaza9084, 2016-9-28)
- Java集合—ConcurrentHashMap原理分析 (zaza9084, 2016-9-29)
- 曾经的Java IDE 王者 Eclipse,它是如何没落的? (zaza9084, 2016-9-30)
收藏
举报
TAG:
java
equals