在值和对象的比较上,经常会遇到到底是使用equals还是==的困惑,下面说下自己在工作上的总结和体会,供交流学习,不足之处还请指出,先看一个例子
int a = 3;
int b = 3;
String stra = new String("iteye");
String strb = "iteye";
System.out.println(a == b);
System.out.println(stra == strb);
System.out.println(stra.equals(strb));
返回的结果为:true false true,
可能有的小伙伴会有疑问,stra和strb不是一样吗,为啥stra==strb会返回false呢?下面就进行说明
1.==
a==b返回为true,很好理解,a和b的值都为3,肯定是相等的,但是为什么stra==strb就返回false了呢?要理解这一点,首先要理解基本数据类型和非基本数据类型的区别。
在Java中游8种基本数据类型:
浮点型:float(4 byte), double(8 byte)
整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)
字符型: char(2 byte)
布尔型: boolean(JVM规范没有明确规定其所占的空间大小,仅规定其只能够取字面值"true"和"false")
对于这8中基本数据类型的变量,变量存储的都是值本身,所以只要值相等,使用==进行比较始终返回true。而对于非基本数据类型的变量,又称为引用类型变量,引用类型变量存储的并不是值本身,而是存储的与其关联的对象在内存中的地址,有点类似于C/C++里面指针的概念。
对于String stra;声明了一个引用类型的变量,此时并未与任何对象关联,而通过new String("iteye");产生了一个对象,此时stra即关联到了该对象上,此时stra中存储的就是它所指向的对象在内存中存储的地址信息,并不是值本身,也就是说不是存储的字符串"iteye"本身,因此使用==进行比较时,返回的结果为false。
2.equals
equals方法是基类Object中的方法,因此对于继承Object的类都存在该方法,如果在类中没有对equals方法进行重写,则默认使用的都是Object类的equals方法。equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。对于像String、Double、Integer、Date等都对equals方法进行了重写,所以调用这些类的equals方法,实际比较的是引用所存储的变量值。
总结:
1)如果==比较的变量是基本数据类型,则比较的是变量值本身是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址。
2)equals方法不能作用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是引用类型的变量所关联对象在内存中的地址;如果对equals方法进行了重写的话,比较的是所指向的对象的内容。
相关推荐
java中equals和==的区别.doc java中equals和==的区别.doc
能够加强对java中equals与==区别的理解。
equals是用来比较对象的内容,而==是用来比较java对象的地址。 貌似这个问题大家都已经十分的了解了?为什么我还要单独拿出来说呢?主要有两个方面的原因: 大家对于equals这个函数的理解不够深入,只凭上面的一句话...
java中equals和==的比较.pdf
equals与==之间的区别,记事本详解
java中equals和==的比较文.pdf
通过例子详细解释java中equals和==区别。实例丰富,适合初学者,便于理解,
java 资料 equals 与== 的区别
Java 中equals和==的区别
java中equals和==的区别.pdf
java中equals和==的区别.docx