• 关于 equals


    JDK1.8后字符串常量池被移动到堆(Heap)中,显式的String常量放在堆里的常量池,而String对象放在普通的堆中。

    复习:栈放的是引用,实际的数据都是保存在堆中。

    String a = "abc";
    String b = "abc";
    String c = new String("abc");
    String d = new String("abc");
    System.out.println(a == b);
    System.out.println(a == c);
    System.out.println(c == d);

    从结果“true false false”反推概念,对象a,b使用显示声明,“abc”是在常量池中的同一个内存,而c,d使用new声明,相当于两个不同的普通对象,分别保存在堆中。

    然后“‘==’比较的是地址,‘equals’比较的是值”这句话对String是成立的,但对其他对象并不完全成立。

    equals是超类Object的一个方法,实际上也是间接使用“==”比较:

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

    其中String重写了equals方法:

    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;
    }
  • 相关阅读:
    第二阶段Sprint2
    第二阶段Sprint1
    Sprint10
    Sprint9
    Sprint8
    Sprint7
    第二阶段个人工作总结(2)
    第二阶段个人工作总结(1)
    查找三个“水王”
    构建之法阅读笔记03
  • 原文地址:https://www.cnblogs.com/LinsenLi/p/12418471.html
Copyright © 2020-2023  润新知