equals和==比较

阅读更多

      在值和对象的比较上,经常会遇到到底是使用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,==)