==和equals的区别

来源:互联网 发布:活水清泉网络诗歌集锦 编辑:程序博客网 时间:2024/05/05 02:42

相信很多童鞋在编写Java程序和学习Java程序的时候都会用到“==”和equals()方法来对对象,字符串或变量进行判断,但是很多童鞋却并不是很了解这两者之间的区别,最近本人粗略的进行了一点了解,现分享给大家!

直接看代码:

 public static void main(String[] args) {        String i = "test";        String z = "test";        System.out.println(i.equals(z));//true        String i = "test";        String z = "test";        System.out.println(i==z);//true        String i = new String( "test");        String z = new String( "test");        System.out.println(i==z);//false        String i = new String( "test");        String z = new String( "test");        System.out.println(i.equals(z));//true    }
看到这里就出现了区别了,从前往后看吧!先看:
        String i = "test";        String z = "test";        System.out.println(i.equals(z));//true
这里调用了一个equals()方法,看看源码:
    public boolean equals(Object arg0) {        if (this == arg0) {            return true;        } else {            if (arg0 instanceof String) {                String arg1 = (String) arg0;                int arg2 = this.value.length;                if (arg2 == arg1.value.length) {                    char[] arg3 = this.value;                    char[] arg4 = arg1.value;                    for (int arg5 = 0; arg2-- != 0; ++arg5) {                        if (arg3[arg5] != arg4[arg5]) {                            return false;                        }                    }                    return true;                }            }            return false;        }    }
看完底层估计就懂了equals()方法,它首先调用的是“==”来判断两个变量的堆内存地址是否一样,一样就true,否则就对两个变量的表面值进行对比,一样就返回true,所以这个肯定是true,因个人水平有限,不知道怎么在源码debug运行,所以这里就不描述底层的运行。
        String i = "test";        String z = "test";        System.out.println(i==z);//true
有部分人会疑问这个地方为什么是true而不是false,上面讲了“==”是用来判断内存地址是否一样的,所以这里也是一样,(关于JAVA内存机制下回详解)这里为什么会是true呢?因为 i和z 都是变量,变量存在于栈内存当中,对象数组存在于堆内存,变量就是堆内存中对象或数组的引用名,所以i和z都是引用了某个堆内存的对象,因为这里没有new,然后值一样,所以java就让他们指向同一个对象,所以堆内存地址一样,最后就是true;
        String i = new String( "test");        String z = new String( "test");        System.out.println(i==z);//false
这个为什么是false呢,因为i和z都new了一个String 所以java就在堆内存开辟了两个空间。地址当然不一样,所以就false!
        String i = new String( "test");        String z = new String( "test");        System.out.println(i.equals(z));//true
这个就不用解释了,只要了解了equals()方法就明白了,这里就不重复了!

看官们如有觉得哪里不对请不要吝啬,多多赐教,感谢大神赐教!期待赐教!

1 0
原创粉丝点击