- 今天再次栽到了引用类型的比较,==和equals()的问题
先说用法:引用类型的比较用equals()判断,基本类型的比较用 ==。
== 比较的是地址,
如果equals()没有被重写,则同样是比较地址;
如果equals()有被重写,则会先比较地址,再比较内容,地址或内容相同都会返回true。
举例说明:
String str = new String(“test”);
如果常量池中没有"test”,会在堆和常量池中均创建"test",且str指向堆中的"test";
如果常量池中已存在"test",则只在堆中创建,str指向堆中的"test"。
String str = “test”;
如果常量池中没有"test”,会常量池中均创建"test";
如果常量池中已存在"test",则指向常量池中的"test"。
List.add(“London”); 和 String str = “test”; 情况相同,只要没有new,就是常量池。
下面是经历:
下面这段代码是我在IDEA中写的,注意输入部分对String的创建方式,导致destCity()中使用==进行字符串比较,获得了正确的答案,虽然答案正确,但不该这样使用。
class Test {
public String destCity(List> paths) {
String ans = "";
for (int i = 0; i < paths.size(); i++) {
ans = paths.get(i).get(1);
boolean flag = false;
for (int j = 0; j < paths.size(); j++) {
//if (ans.equals(paths.get(j).get(0))) {
if (ans == paths.get(j).get(0)) {
flag = false;
break;
}
//if (ans.equals(paths.get(j).get(0))) {
if (ans != paths.get(j).get(0)) {
flag = true;
}
}
int a = 1 / 0;
if (flag) {
return ans;
}
}
return ans;
}
public static void main(String[] args) {
List> paths = new ArrayList<>();
List stringList1 = new ArrayList<>();
List stringList2 = new ArrayList<>();
List stringList3 = new ArrayList<>();
stringList1.add("London");
stringList2.add("Lima");
stringList3.add("Lima");
stringList3.add("Sao Paulo");
paths.add(stringList1);
paths.add(stringList2);
paths.add(stringList3);
Test test = new Test();
System.out.println(test.destCity(paths));
}
}
这段代码的方法体用在LeetCode每日一题【1436. 旅行终点站】中的时候,得到了错误的答案(应该是和那一题中没有显式写出的String的创建有关),将==改为equals()后通过。



