1、java中String类型变量不同创建方式==判断情况如下:
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class StringTest {
private static final Logger logger = LoggerFactory.getLogger(StringTest.class);
@Test
public void testString() {
String aString = "ja";
String bString = "va";
String cString = "java";
String dString = aString + bString; // 反编译会发现是通过StringBuilder新建对象实现相加的
logger.debug("dString == cString:{}", dString == cString); // false
String eString = "java";
String fString = "ja" + "va"; // 这是直接合并为"java",然后常量池中寻找相等对象
logger.debug("eString == fString:{}", eString == fString); // true
String gString = new String("java"); // new方法永远都新建对象
logger.debug("eString == gString:{}", eString == gString); // false
}
}
2、equals()方法String重写Object中的equals()方法,变为只判断值是否相等:
public boolean equals(Object obj) { // Object中的equals()方法
return (this == obj);
}
public boolean equals(Object anObject) { // String中重写的equals()方法
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;
}