黑马程序员技术交流社区

标题: 哈希值 [打印本页]

作者: 李敏    时间: 2012-4-9 23:08
标题: 哈希值
class fu{
        static String name="zhangsan";
        public void show(){
                System.out.println("fu..."+name);
        }
}
class zi extends fu{
        public void show(){
                System.out.println("zi..."+name.hashCode());
                super.show();
        }
}
public class Demo {
        public static void main(String[] args) {
                zi z=new zi();
                z.show();
        }
}
刚才回答问题遇到哈希值前面一个符号。咋回事?
//zi...-1432604556
//fu...zhangsan
作者: 张卯    时间: 2012-4-9 23:13
是指@吗?LZ可以详细说明吗?
作者: 李敏    时间: 2012-4-9 23:30
张卯 发表于 2012-4-9 23:13
是指@吗?LZ可以详细说明吗?

只是没想到调用 String 的hashCode 方法,弄出来个负的出来,不晓得正不正常。

作者: 张卯    时间: 2012-4-9 23:55
李敏 发表于 2012-4-9 23:30
只是没想到调用 String 的hashCode 方法,弄出来个负的出来,不晓得正不正常。
...

我试了,也是显示负数:
D:\Java\jdk1.7.0_01\mycodes\test>javac Demo.java

D:\Java\jdk1.7.0_01\mycodes\test>java Demo
zi...-1432604556
fu...zhangsan
作者: 马强    时间: 2012-4-10 21:10
哈希值有自己的算法,当你调用hashcode自动返回的值是
      
       s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)

所以,你换个name值不一样,也许负也许正
作者: 马强    时间: 2012-4-10 21:29
int 有范围 算完值之后超过了就变负数 之后继续增长变正数,反正在int的范围内变化。根据name的长短和ascii码不同而不同
作者: 邓斌    时间: 2012-4-10 21:29
结果应该没错的。。。
zi用fu中的name;
所以zi和fu 的name值都是一样的。
  1. class fu{
  2.         static String name="zhangsan";
  3.         public void show(){
  4.                 System.out.println("fu..."+name.hashCode());
  5.         }
  6. }
  7. class zi extends fu{
  8.        /*public void show(){
  9.                 System.out.println("zi..."+name.hashCode());
  10.                 super.show();
  11.         }
  12.                 */
  13. }
  14. class Demo {
  15.         public static void main(String[] args) {
  16.                 zi z=new zi();
  17.                 z.show();
  18.         }
  19. }
复制代码
输出结果:
fu...-1432604556




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2