我不认为这种方法可以避免碰撞。我认为如果key.hashcode大于table.length,就会发生冲突。
\n\n更新\xef\xbc\x9a\n实际上我参考了HashMap#hashJDK 1.8 中的 ,并且对向下扩展高位的好处有点困惑。\n现在,我想在这个链接的帮助下我已经清楚了,好处是:
对于冲突来说,如果key的数量大于表的长度,那么无论使用什么哈希方法都会发生冲突。
\n我正在尝试删除值为的所有条目null.代码是:
Map<String, String> map = new HashMap<>();
map.put("one", null);
map.put("two", null);
map.put("three", "THREE");
Iterator iterator = map.values().iterator();
while (iterator.hasNext())
{
if (iterator.next() == null) {
iterator.remove();
}
}
for (Map.Entry<String, String> e : map.entrySet()) {
System.out.println(e.getKey() + ":" + e.getValue());
}
Run Code Online (Sandbox Code Playgroud)
我的问题是iterator绑定map.values,为什么它可以删除整个条目?
考虑一下片段:
int a = 1, b = 1, c = 1;
System.out.println(a + ++a);
System.out.println(b++ + ++b);
System.out.println(c++ + c);
Run Code Online (Sandbox Code Playgroud)
输出是:
3
4
3
Run Code Online (Sandbox Code Playgroud)
这是我认为正在发生的事情,但输出不匹配:
1. ++a -> +a -> 4 = 2 + 2
2. ++b -> +b -> 4 = 2 + 2
3. c -> +c -> 2 = 1 + 1
Run Code Online (Sandbox Code Playgroud) 我只是从eta扩展中找到了一些间接线索
SimpleExpr :: = SimpleExpr1`_
'如果表达式_是方法类型或如果是按名字调用参数,则表达式_的格式正确。
如果是带有参数的方法,则_表示通过eta扩展转换为函数类型。
如果是类型=>的无参数方法或按名称调用参数,则_表示类型()=>的函数,该函数评估何时将其应用于空的参数列表()。
所以我猜eta是匿名函数表达的缩写吗?我对吗?
我试图array在other中进行更改func,然后返回更改。因此,我在下面编写了一个示例代码,我的问题是为什么changeArr02函数的更改会影响原点,arr而changeArr01不会影响原点。
package main
import "fmt"
func changeArr01(arr [1]int) {
arr[0] = -100
}
func changeArr02(arr []int) {
arr[0] = -200
}
func main() {
arr01 := [1]int{}
changeArr01(arr01)
fmt.Println(arr01) // 0
arr02 := []int{0}
changeArr02(arr02)
fmt.Println(arr02) // -200
}
Run Code Online (Sandbox Code Playgroud)