- package string;
- public class StringHashCodeTest {
- //s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
- /*
- * public int hashCode()
- * 返回此字符串的哈希码。String 对象的哈希码根据以下公式计算:
- s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
- 使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)
-
- 覆盖:
- 类 Object 中的 hashCode
- 返回:
- 此对象的哈希码值。
- 另请参见:
- Object.equals(java.lang.Object), Hashtable
- *
- *
- public boolean equals(Object anObject)
- 将此字符串与指定的对象比较。
- 当且仅当该参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,
- 结果才为 true。
-
- 覆盖:
- 类 Object 中的 equals
- 参数:
- anObject - 与此 String 进行比较的对象。
- 返回:
- 如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回 false。
- 另请参见:
- compareTo(String), equalsIgnoreCase(String)
- *
- *
- * */
- public static void main(String[] args)
- {
- //97*1=97
- String a="a";
- //97*1=97
- String b=a;
- //97*31+97=3104
- String c=b+a;
- //97*31+97=3104
- String d="a"+"a";
- //97*1=97
- String m=new String("a");
-
-
- //上面的注释根据API给出的算法计算每个字符串的hashCode,所以这里不需要解释了
- System.out.println(c.hashCode()+"--"+d.hashCode()+"--"+m.hashCode());
- /*
- * String重写了Object中的equals方法
- * 就是判断字符串内容是否相同
- * 所以这里不难理解
- * */
- System.out.println(c.equals(d));
-
- //这里涉及到一个常量池的概念,不在代码里说了,下面会说
- System.out.println(c==d);
- }
- }
复制代码
http://developer.51cto.com/art/201106/266454.htm这里是一个研究JVM的人的说法
简单的说,就是所有以"ddd"这种形式赋值的String变量都是通过中间常量,最后在常量池中组合出一个常量,地址赋值给这个变量的,而任何通过对象或者new方法产生的对象都在编译时期无法确定的,所以都是在运行时期在堆中重新开辟的空间,然后赋值的,这里d是通过常量计算得来的,而c不是,所以c和d的地址值不同,所以不等 |