起因是在刷题时,要在二叉树中找到两个节点的公共祖先,手敲代码一直运行不通过,这里用dfs函数查找出从根节点到两个节点的路径path1和path2,要对比两个数组中值相等的地方,结果一直不通过
public int lowestCommonAncestor (TreeNode root, int o1, int o2) {
// write code here
ArrayList<Integer> path1 = new ArrayList<Integer>();
ArrayList<Integer> path2 = new ArrayList<Integer>();
dfs(root, o1, path1);
flag = false;
dfs(root, o2, path2);
int res = 0;
for (int i = 0; i < path1.size() && i < path2.size(); i++) {
if (path1.get(i) == path2.get(i)) {
res = path1.get(i);
} else {
break;
}
}
return res;
}
对比了官方的代码,发现就对比的时候不一样,一开始感觉自己写的没啥问题
for(int i = 0; i < path1.size() && i < path2.size(); i++){
int x = path1.get(i);
int y = path2.get(i);
if(x == y)
//最后一个相同的节点就是最近公共祖先
res = x;
else
break;
}
看了半天,突然想起来 ,java中==是在对比地址,而equals才是对比值,所以我的代码其实是在对比两个数组中元素的地址,那当然是不相等了,而官方的代码中,定义了两个整数型常量来对比,那为什么两个整数型常量的地址就相等呢?
其实equals是Java的老祖宗类Object里的方法,所有的类都是Object的基类,如果不覆盖Object里的equals方法,还是比较地址。但String或Integration类里,已经重写了equals方法,重写的方法是比较值。
String a = “123”; String b = “123”; a==b;是返回true,而不是false。这里先说明,==是比较地址,但这里a和b是常量,JVM里,常量为了节省空间,是用共享内存的方式放在常量池,所以a和b虽然是两个不同对象,但却是共享了内存地址,所以a==b是返回true。
如果String a = new String(“123”);String b = new String(“123”);,a和b是用new创建的,所以是在堆空间里被分配了两个不同的空间,所以地址不同,这里a==b返回false,但是,a.equals(b),由于是比较值,是返回true。