Set接口在对象往里加之前做了个判断。采用的是对象的equals方法去比较一下,如果发现两个对象是相等的,他就认为对象已经存在,为了保证Set接口的唯一性,即使你再加多次,set.size()还是只算1个长度,
首先是栈中变量s1在堆中创建了一个新的字符串对象”java“,
s2=s1,s3又在堆里new了一个新对象”java“
代码如下:
public class SetTest2 {
public static void main(String[] args) {
Set set=new HashSet();
String s1=new String("java");
String s2=s1;
String s3=new String("java");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());
}
}
运行结果:size为1
原因:
string字符串类对从object类里继承过来的equals方法进行了重写,已经比较过string类里面的内容是否相等,虽然s1,s2和s3是不同的引用,但由于string字符串类特殊性,他们内容是一样的,所以s1,s2和s3equals()以后,他们的结果是true,所以机器认为就是同一个对象,所以size不会增加,依旧是1.