随便总结:可能有些问题,希望看到的人可以给点补充和修改建议。
String是字符串类型,不属于java的原始数据类型,所以存放于内存的堆中。举个例子
String ggg = "fff";
String hhh = "fff";
String gg = new String("fff");
String hh = new String("fff");
代码中定义这四个变量,他们的值都是“fff”,但是实际上确实不完全相同的。使用equals去比较
System.out.println(ggg.equals(hhh));
System.out.println(ggg.equals(gg));
System.out.println(hhh.equals(gg));
System.out.println(hh.equals(gg));
结果都为:true
那就奇怪了,不是不完全相同吗?为何还是true呢?
例子中的equals只是比较了字符串中字符的匹配情况,所以只要是字符相互匹配,则equals这个方法就返回true,以上例子就是这样的情况,看一下java.lang.String中的equals方法的源码:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
然后现在看看其他的:
System.out.println(ggg == hhh);
System.out.println(ggg == gg);
System.out.println(hhh == gg);
System.out.println(hh == gg);
结果就变成了:
true
false
false
false
怎么就出现false了?值不是相等的吗?
嗯,值是相等的,但是==号还要比较他们的存储地址,
System.out.println(ggg == hhh);
这个相等是因为,刚开始“ggg”定义了”fff”,存放于堆中,而“ggg”的值其实是字符串“fff”存放的地址,在java虚拟机没有进行垃圾回收前,在定义其他对象,会先从堆中去寻找这个对象是否存在,如果存在,则将地址赋予“hhh”,所以不会去创建新的对象,所以他们的值和地址都是相等的,使用“==”去比较也就想等了。
而使用new String("fff")
这中方式是每次创建一个对象,每次都会在堆中生成相对应的地址和内容,所以内容相同,但是内存地址却不一致,所以结果为 false;