1.PriorityQueue的方法iterator()中提供的迭代器并不保证以有序的方式遍历优先级队列中的元素,因此不能使用此迭代器依次遍历PriorityQueue中的队头元素。
2. hash函数避免冲突的经验值取大质数(如果capacity比较大的话)。比如如下的冲突避免hash function。
1 private int getHash(int[] count) { 2 int hash = 0; 3 int a = 378551; 4 int b = 63689; 5 for (int num : count) { 6 hash = hash * a + num; 7 a = a * b; 8 } 9 return hash; 10 }
附一张big prime number table
| lwr | upr | % err | prime |
|---|---|---|---|
| 25 | 26 | 10.416667 | 53 |
| 26 | 27 | 1.041667 | 97 |
| 27 | 28 | 0.520833 | 193 |
| 28 | 29 | 1.302083 | 389 |
| 29 | 210 | 0.130208 | 769 |
| 210 | 211 | 0.455729 | 1543 |
| 211 | 212 | 0.227865 | 3079 |
| 212 | 213 | 0.113932 | 6151 |
| 213 | 214 | 0.008138 | 12289 |
| 214 | 215 | 0.069173 | 24593 |
| 215 | 216 | 0.010173 | 49157 |
| 216 | 217 | 0.013224 | 98317 |
| 217 | 218 | 0.002543 | 196613 |
| 218 | 219 | 0.006358 | 393241 |
| 219 | 220 | 0.000127 | 786433 |
| 220 | 221 | 0.000318 | 1572869 |
| 221 | 222 | 0.000350 | 3145739 |
| 222 | 223 | 0.000207 | 6291469 |
| 223 | 224 | 0.000040 | 12582917 |
| 224 | 225 | 0.000075 | 25165843 |
| 225 | 226 | 0.000010 | 50331653 |
| 226 | 227 | 0.000023 | 100663319 |
| 227 | 228 | 0.000009 | 201326611 |
| 228 | 229 | 0.000001 | 402653189 |
| 229 | 230 | 0.000011 | 805306457 |
| 230 | 231 | 0.000000 | 1610612741 |
3. 判断两个Integer对象相等时一律用equals方法,只有Integer的值在-128 - 127才不会new Integer,直接==比较不会出错。超出这个范围比较的就是内存地址。
4.Iterator中的next方法返回的是Object对象,所以一定要记得强制转换成原来的类型。比如(Integer) it.next()。