对于基本数据类型:
如int,double, float......等。 ==比较的都是值。
对于String类型普遍大家有容易混淆的地方。
首先看一下实例代码:
在比较String类型的等式中,== 和 equals返回的结果都是true。其内部原理如下:
在java中比较String类型时用==来判断的话比较的是字面值。因为String类型在没有用new()关键字的情况下如果字面值相同则指向同一个内存地址。原则上==在比较引用类型时比较的是引用类型的地址,因为String的特殊性,因此虽然声明了两个String类型的对象,但实际上确实两个对象地址相同,因此返回的是 true。
用以下的例子便可更加清晰明朗:
在我重新生成一个String对象时(即用了new关键字声明新的String类型对象)。此时内存会开辟一个新的空间,将new出来的对象存在堆内存中,这个时候两个对象的引用地址指向了两个不同的内容,因此再一次用==比较二者的时候返回值为 false。
内存图如下:
---------------------------------equals-----------------------------------------------------------------------------
在Java定义中,equals默认比较的是引用数据类型的地址。然而在测试equals时问题出现了,a,b相等是因为二者指向同一内存地址可以理解。但是 a c明明是两个不同的对象,指向不同的地址,为什么结果还是返回了true?
原来String类底层重写了equals方法,使得原本比较地址的功能转换成了比较值的功能。因此当a c定义的字面值相同时,即使不是同一个对象,返回的也是true。
而在实际开发中,针对不同的业务,在判断两个对象是否被认定为同一个事物的时候,我们同样也可重写equals和hashcode方法:
在eclipse中,使用ALT+SHIFT+S快捷键中找到选择根据对应的属性作为判断事物的唯一特征,便可实现类似String中equals用来比较值的方案。另补充:除String外,包装器类型(Integer..等),Date等底层都是重写了hashcode和equals方法,因此道理同String相同不一一赘述。
初学java,日常总结,如有异议,欢迎指正。
2020/9/10记于公司,祝所有老师们节日快乐。