这个问题要从java表示数据的方式说起,java有两类数据类型:基本数据类型(int,char等)和复合数据类型(就是类)。对于基本数据类型,java会在内存中开辟数个字节存储其实际内容,比如int占用4个字节,char占用一个字节;而对于复合数据类型,由于通常其数据较多所以占用内存也很多,java的做法是为实际数据开辟一块内存A,另外开辟一处内存B 存储实际数据存储区A的地址(即引用),使用时只是通过B找到A,再对A进行相应操作。String是复合数据类型。String sName="Jone";该语句会开辟一处内存A1存储"Jone",然后再开辟一块内存B1即sName,用来存放"Jone"内存区A1的首地址。同样语句String sUser="Jone";也如此分配内存,内存A2存储"Jone",内存B2即sUser存放A2的首地址。注意:虽然A1和A2存储的内容一样但是它们的首地址是不一样的。
在java中,==就是直接比较两块内存的内容是否相等,表达式sName==sUser的实质是比较内存A1和A2的内容是否相等,即比较内存B1和B2的首地址是否相等,结果当然是false。因此比较两个String对象的内容是否相等用==是不准确的,所以java的String类提供了equals()方法,该方法就是通过对象的引用找到实际的内容区进行比较。具体请参考jdk文档对equals()方法的说明。
以上是我给人的见解,不对之处请大家指正。谢谢 |