本帖最后由 toShareBeauty 于 2013-7-9 21:29 编辑
== 运算符是当两个引用指向同一个对象的时候才会返回 true;前面其实说过,String 类型的 hashcode 函数已经被重写,不是 Object 的 hashcode 而返回的是 String 内部成员 char[] 对象的中所有字符按照 hashcode 算法计算的 hashcode 值(注意:上个回答我说错了,我以为返回的是 char 对象的 hashcode 值,i’m very sorry),这个值只能保证字符串的内容是不是一样,不能表示对象的存储关系,就算因为 flyweight 模式的关系 s1 s2 内部的 char[] 是同一个对象(从我调试结果来看其实不同)。但是 s1 s2 对应的 String 对象却不是同一个。- /**
- * Returns a hash code for this string. The hash code for a
- * <code>String</code> object is computed as
- * <blockquote><pre>
- * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
- * </pre></blockquote>
- * using <code>int</code> arithmetic, where <code>s[i]</code> is the
- * <i>i</i>th character of the string, <code>n</code> is the length of
- * the string, and <code>^</code> indicates exponentiation.
- * (The hash value of the empty string is zero.)
- *
- * @return a hash code value for this object.
- */
- public int hashCode() {
- int h = hash;
- if (h == 0 && value.length > 0) {
- char val[] = value;
- for (int i = 0; i < value.length; i++) {
- h = 31 * h + val[i];
- }
- hash = h;
- }
- return h;
- }
复制代码- /** The value is used for character storage. */
- private final char value[];
- /** Cache the hash code for the string */
- private int hash; // Default to 0
复制代码 上面是 String 的源码 其中
private final char value[];
这个地方也足以说明我前面的结论,String 对象不可以修改,是因为有个 final 的 char[] 引用类型的成员变量。
调试过程中 s1 s2 中的数组引用:
|