public class containsText {
public static void main(String[] args) {
/*boolean contains (Object o )*/
Collection c = new ArrayList(); /*创建一个集合*/
String s1 = new String("abc");
String s2= new String("def");
String x = new String("abc");
c.add(s1);
c.add(s2);
System.out.println(c.contains(x) );
}
}
对于上面的内容,如果问: System.out.println(c.contains(x) );的最终输出结果是什么?
答案是:true。
从上面那段代码中看,我们显然没有向集合c中添加对象x,但是结果为什么还是true呢?
首先我们应该知道的是,集合中不能直接存储Java对象,而是存储的Java对象的内存地址(比如OX111)。
当我们第一次将字符串“abc”以对象的形式new出来的时候,“abc”这段字符串也在方法区中的字符串常量池中存在了。所以我们并没有直接存入x的地址。
通俗的来说:s1指向堆中的一个String类型的对象
同样x也是,指向堆中的另一个Sting类型的对象
但此时仅仅能说明s1和x指向的不同,不是一个String对象,但为啥结果是true?
原因就是String类中实现了equals()方法。
从而导致了s1指向堆中的一个String类型的对象,而这个String类型对象指向字符串常量池中的“abc”,同样x也是如此。
String类型中自动实现了equals()方法,从而导致我们对比的是s1和x所指向的内容,而不是s1和x所存储的内存地址。
如果没有实现equals()方法,此时对比的就是s1和x直接存储的内容,也就是内存地址,显然是false。
大家在对比的时候,一定要记得实现equals()方法
不理解可以看图