A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李敏 中级黑马   /  2012-4-9 23:08  /  2043 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

6 个回复

倒序浏览
是指@吗?LZ可以详细说明吗?
回复 使用道具 举报
张卯 发表于 2012-4-9 23:13
是指@吗?LZ可以详细说明吗?

只是没想到调用 String 的hashCode 方法,弄出来个负的出来,不晓得正不正常。
回复 使用道具 举报
李敏 发表于 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
回复 使用道具 举报
哈希值有自己的算法,当你调用hashcode自动返回的值是
      
       s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
使用 int 算法,这里 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为 0。)

所以,你换个name值不一样,也许负也许正
回复 使用道具 举报
int 有范围 算完值之后超过了就变负数 之后继续增长变正数,反正在int的范围内变化。根据name的长短和ascii码不同而不同
回复 使用道具 举报
邓斌 中级黑马 2012-4-10 21:29:59
7#
结果应该没错的。。。
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
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马