在String、Object中equals的区别

在String、Object中equals的区别

1.String类中的equals方法

//equals: String类重写了Object的equals方法 (简单来说就是比较字符串内容是否相同)
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String aString = (String)anObject;
            if (coder() == aString.coder()) {
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                                  : StringUTF16.equals(value, aString.value);
            }
        }
        return false;
    }
  • equals方法中使用的coder方法

byte coder() {
        return COMPACT_STRINGS ? coder : UTF16;
    }
  • equals方法中使用的isLatin1方法

private boolean isLatin1() {
        return COMPACT_STRINGS && coder == LATIN1;
    }

2.Object类中的equals方法

//equals: Object类equals方法 (底层就是两个对象地址的比较)
public boolean equals(Object obj) {
        return (this == obj);
    }


3.双等于("==")

对于基础数据类型 比较的是数值大小
对于引用数据类型 比较的是地址


4.小细节

String strA="abc";

String strB=new String ("abc");

//上面两者的实现有所不同

异
	strA:存放在堆中的常量池中。
	strB:存放在堆中(是new出来的 是一个对象)。

同:
	两者最底层都是一个被final修饰的byte[]
private final byte[] value;

2.拓展小知识(String、StringBuilder、StringBuffer)

  • String: (底层是一个 final byte[] value;所以一旦创建长度不能更改。)

    在String、Object中equals的区别


  • StringBuilder:(底层是一个 byte[] value;所以不存在String的问题。适合在单线程中使用)

在String、Object中equals的区别


  • StringBuffter:(与StringBuilder相似,只是它更适合在多线程中使用)

在String、Object中equals的区别