String

作者: 一颗老鼠屎 | 来源:发表于2021-06-14 10:23 被阅读0次

String

/** The value is used for character storage. */
private final char value[];

/** Cache the hash code for the string */
private int hash; // Default to 0

底层是被final修饰的字符数组,所以字符串生成后不能被修改。

    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;
    }

equals方法被重写,比较的是字符数组中的元素是否相同。

String s1 = new String("sd");  //打印s1,打印的是堆中对象的地址值
String s2 = "sdfdsf";    //打印s2,打印的是常量池中的地址值

如果常量池中有"sdfdsf",那么变量s会直接指向常量池中的字符串,不会再在常量池中开辟新的空间

String s1 = new String("哈哈");
String s2 ="哈哈";
s1.intern() == s2;    //true
s1==s2    //false

new String("哈哈");"哈哈"在方法区的常量池中开辟空间暴露地址值,"new String()"在堆中开辟空间暴露地址值,并指向"哈哈"的地址值。
所以s1和s1的地址值不相同,一个在堆中,一个在常量池中。
但最终都是指向常量池中"哈哈"的地址值。

== 和 equals

== 的作用:
  基本类型:比较的就是值是否相同
  引用类型:比较的就是地址值是否相同
equals 的作用:
  引用类型:默认情况下,比较的是地址值。

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

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    ....
}

相关文章

网友评论

      本文标题:String

      本文链接:https://www.haomeiwen.com/subject/djlbeqtx.html