我的第一篇博客

来源:互联网 发布:合肥飞友网络招聘 编辑:程序博客网 时间:2024/06/10 10:33

2016年3月15日,昨天开通了CSDN博客,今天写下第一篇博客,正式开启我的博客之旅。一点一点写,一步一步成长。目前在巩固Java基础知识,这篇博客就写关于Java中的一个知识点:【==与equals】
Object类的equals方法如下:

   public boolean equals(Object obj) {       return (this == obj);   }

可以看到,equals方法和==没有区别,equals方法还是在比较引用的地址是否相同。
看如下例子:

    public static void main(String[] args) {        String str_1 = "hello world";        String str_2 = "hello world";        String str_3 = new String("hello world");        System.out.println(str_1 == str_2);        System.out.println(str_1.equals(str_2));        System.out.println(str_1 == str_3);        System.out.println(str_1.equals(str_3));    }

程序输出如下:
true
true
false
true

第一条输出true,可以看到str_1和str_2引用地址相同。首先,创建的str_1变量被赋值为”hello world”常量,String常量会被分配在JVM常量池,然后创建的str_2变量同样要被赋值为”hello world”,JVM会首先查找常量池是否存在该常量,如果存在,便将str_2指向该常量,如果不存在,存储新的String常量并使str_2指向该常量,很显然”hello world”已经存在于常量池,所以str_1和str_2均指向”hello world”常量,所以str_1和str_2 的地址相同,故输出true。这是JVM对String类的优化。
第二条输出true,是因为equals比较str_1和str_2的指向的内容是否相同,很显然是相同的,故输出true。
第三条输出false,可以看到str_1和str_3的引用地址不同,这是因为str_3指向new字符新建的String对象,使用new字符创建的对象被JVM分配在堆中,所以str_1和str_3的引用地址不同,这也是创建String变量的两种方式的不同之处。
第四条输出true,可以从第三条中看到str_1和str_3的引用地址是不同的,根据从Object类继承而来的equals方法来看,两者引用地址不同,那么(this == obj)应该返回false,现在输出true,这是因为String类重写了equals方法,如下:

    private final char value[];    public boolean equals(Object anObject) {        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;    }

可以看到,虽然str_1和str_3的引用地址不同,但其长度和对应字符均相同,也就是内容相同,则返回true。

1 0
原创粉丝点击