Java 判断相等 ==和.equals()的区别

起因是在刷题时,要在二叉树中找到两个节点的公共祖先,手敲代码一直运行不通过,这里用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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值