问题:s1,s2都是String对象,说说表达式s1==s2与s1.equal(s2)的区别。
回答:
s1 == s2 与 s1.equals(s2)区别主要取决与两个方面,第一个方面是==操作符和equals函数之间的区别,第二个方面是String对象的特殊性。
首先,==是操作符,它的主要作用是比较两个对象之间是否是同一个,也就是说比较操作符两端的对象在对内存当中是否是同一个地址。equals函数是在Object类当中定义的函数,由于在Java当中每个类都是Object的子类,所以每个类都从Object当中继承了equals方法。在Object当中equals函数和==的作用是一样的,而我们所编写的类从原则上来讲,都应该覆写equals方法,覆写之后的equals方法是用来比较两个对象的内容是否相等。所谓的内容相等应该符合两个条件,第一个是两个对象的类型是否相等,第二是这两个对象成员变量的值是否相等。
其次,String类的对象可以直接使用字面量赋值,而且多个String引用指向同一个字面量时,在堆内存当中只有一个Java对象。如果调用String的构造函数给String类型的引用赋值,那么每调用一次构造函数,在堆内存当中就会生成一个String对象。所以如果s1和s2都是同一个字面量赋值,那么无论是用==比较,还是用equals函数比较,都会返回true。如果s1和s2都是使用构造函数生成的对象,并且传入构造函数参数的字面量相等,那么用==比较会返回false,用equals比较就会返回true。