String 中的hashCode方法

public int hashCode() { 

    int h = hash; 
  int len = count; 
  if (h == 0 && len > 0) { 
  int off = offset; 
  char val[] = value; 
  for (int i = 0; i < len; i++) { 
     h = 31*h + val[off++]; ///////////////看这里
   } 
  hash = h; 
  } 
  return h; 
}

1、上文使用31的原因:

(1)31是一个素数(只能被自身和1整除,减少冲突);

(2)h*31可以被虚拟机优化为(h<<5),提高算法效率;

(3)数值尽量大,hash地址就越大,减少冲突;

(4)31只占用5bits(11111),相乘溢出概率小;

猜你喜欢

转载自my.oschina.net/u/3847203/blog/1816156