Java 哈希表:在发生冲突的情况下 Hashtable ht=newhashtable(); 对于(int i=0;i

Java 哈希表:在发生冲突的情况下 Hashtable ht=newhashtable(); 对于(int i=0;i,java,collections,hashtable,Java,Collections,Hashtable,上面的代码片段正在打印99、98、…90 但我想打印所有100个元素。 如何获得一个数字列表,如。。。 99,89,79,69,...19,9 98,88,78,68....18,8 97,87,77,67....17,7 .. .. 91,81,71,61…11,1 基本上所有冲突列表。您当前正在使用i%10作为哈希映射键,它只有十个值(0-9)。因此,只有最后十个值存储在地图中,所有其他值都被覆盖 如果需要在每个存储桶中存储多个项目,请使用列表类型作为值。例如: Hashtable h

上面的代码片段正在打印99、98、…90

但我想打印所有100个元素。 如何获得一个数字列表,如。。。 99,89,79,69,...19,9 98,88,78,68....18,8 97,87,77,67....17,7 .. .. 91,81,71,61…11,1


基本上所有冲突列表。

您当前正在使用
i%10
作为哈希映射键,它只有十个值(
0-9
)。因此,只有最后十个值存储在地图中,所有其他值都被覆盖

如果需要在每个存储桶中存储多个项目,请使用列表类型作为值。例如:

   Hashtable ht = new Hashtable();
    for (int i = 0; i < 100; i++) {
        ht.put(i%10, i);
    }

    Enumeration< Integer> eles = ht.elements();
    while(eles.hasMoreElements())
        System.out.println(eles.nextElement());
[9, 19, 29, 39, 49, 59, 69, 79, 89, 99] [8, 18, 28, 38, 48, 58, 68, 78, 88, 98] [7, 17, 27, 37, 47, 57, 67, 77, 87, 97] [6, 16, 26, 36, 46, 56, 66, 76, 86, 96] [5, 15, 25, 35, 45, 55, 65, 75, 85, 95] [4, 14, 24, 34, 44, 54, 64, 74, 84, 94] [3, 13, 23, 33, 43, 53, 63, 73, 83, 93] [2, 12, 22, 32, 42, 52, 62, 72, 82, 92] [1, 11, 21, 31, 41, 51, 61, 71, 81, 91] [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
Hashtable ht=newhashtable();
对于(int i=0;i<100;i++){
int key=i%10;
列表=ht.get(键);
if(list==null){
列表=新的ArrayList();
ht.put(键、列表);
}
列表.添加(i);
}
枚举元素=ht.elements();
while(eles.hasMoreElements()){
System.out.println(Arrays.toString(eles.nextElement().toArray());
}
输出:

Hashtable<Integer, List<Integer>> ht = new Hashtable<>();
for (int i = 0; i < 100; i++) {
  int key = i % 10;
  List<Integer> list = ht.get(key);
  if (list == null) {
    list = new ArrayList<>();
    ht.put(key, list);
  }
  list.add(i);      
}

Enumeration<List<Integer>> eles = ht.elements();
while (eles.hasMoreElements()) {
  System.out.println(Arrays.toString(eles.nextElement().toArray()));
}
[9, 19, 29, 39, 49, 59, 69, 79, 89, 99] [8, 18, 28, 38, 48, 58, 68, 78, 88, 98] [7, 17, 27, 37, 47, 57, 67, 77, 87, 97] [6, 16, 26, 36, 46, 56, 66, 76, 86, 96] [5, 15, 25, 35, 45, 55, 65, 75, 85, 95] [4, 14, 24, 34, 44, 54, 64, 74, 84, 94] [3, 13, 23, 33, 43, 53, 63, 73, 83, 93] [2, 12, 22, 32, 42, 52, 62, 72, 82, 92] [1, 11, 21, 31, 41, 51, 61, 71, 81, 91] [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
您当前正在使用
i%10
作为哈希映射键,它只有十个值(
0-9
)。因此,只有最后十个值存储在地图中,所有其他值都被覆盖

如果需要在每个存储桶中存储多个项目,请使用列表类型作为值。例如:

   Hashtable ht = new Hashtable();
    for (int i = 0; i < 100; i++) {
        ht.put(i%10, i);
    }

    Enumeration< Integer> eles = ht.elements();
    while(eles.hasMoreElements())
        System.out.println(eles.nextElement());
[9, 19, 29, 39, 49, 59, 69, 79, 89, 99] [8, 18, 28, 38, 48, 58, 68, 78, 88, 98] [7, 17, 27, 37, 47, 57, 67, 77, 87, 97] [6, 16, 26, 36, 46, 56, 66, 76, 86, 96] [5, 15, 25, 35, 45, 55, 65, 75, 85, 95] [4, 14, 24, 34, 44, 54, 64, 74, 84, 94] [3, 13, 23, 33, 43, 53, 63, 73, 83, 93] [2, 12, 22, 32, 42, 52, 62, 72, 82, 92] [1, 11, 21, 31, 41, 51, 61, 71, 81, 91] [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
Hashtable ht=newhashtable();
对于(int i=0;i<100;i++){
int key=i%10;
列表=ht.get(键);
if(list==null){
列表=新的ArrayList();
ht.put(键、列表);
}
列表.添加(i);
}
枚举元素=ht.elements();
while(eles.hasMoreElements()){
System.out.println(Arrays.toString(eles.nextElement().toArray());
}
输出:

Hashtable<Integer, List<Integer>> ht = new Hashtable<>();
for (int i = 0; i < 100; i++) {
  int key = i % 10;
  List<Integer> list = ht.get(key);
  if (list == null) {
    list = new ArrayList<>();
    ht.put(key, list);
  }
  list.add(i);      
}

Enumeration<List<Integer>> eles = ht.elements();
while (eles.hasMoreElements()) {
  System.out.println(Arrays.toString(eles.nextElement().toArray()));
}
[9, 19, 29, 39, 49, 59, 69, 79, 89, 99] [8, 18, 28, 38, 48, 58, 68, 78, 88, 98] [7, 17, 27, 37, 47, 57, 67, 77, 87, 97] [6, 16, 26, 36, 46, 56, 66, 76, 86, 96] [5, 15, 25, 35, 45, 55, 65, 75, 85, 95] [4, 14, 24, 34, 44, 54, 64, 74, 84, 94] [3, 13, 23, 33, 43, 53, 63, 73, 83, 93] [2, 12, 22, 32, 42, 52, 62, 72, 82, 92] [1, 11, 21, 31, 41, 51, 61, 71, 81, 91] [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
您在示例中观察到的是而不是碰撞效应。这是正常的元件更换。 在100次迭代之后,哈希表中只有10个元素

您使用数字i%10(0,1,…,9)作为键。所以,你只有10把不同的钥匙。 例如:在For循环中,为key=5(i=5,i=15,i=95)输入10个值,每个输入(5,val)替换与key=5关联的旧值

冲突列表是不同的概念。

对于每个键,哈希表计算一些哈希值,并使用此哈希选择其内部bucket表中的索引。接下来将{key,value}放在该索引下。 冲突是指两个不同的键计算了相同的bucket索引的情况

例如:

   Hashtable ht = new Hashtable();
    for (int i = 0; i < 100; i++) {
        ht.put(i%10, i);
    }

    Enumeration< Integer> eles = ht.elements();
    while(eles.hasMoreElements())
        System.out.println(eles.nextElement());
[9, 19, 29, 39, 49, 59, 69, 79, 89, 99] [8, 18, 28, 38, 48, 58, 68, 78, 88, 98] [7, 17, 27, 37, 47, 57, 67, 77, 87, 97] [6, 16, 26, 36, 46, 56, 66, 76, 86, 96] [5, 15, 25, 35, 45, 55, 65, 75, 85, 95] [4, 14, 24, 34, 44, 54, 64, 74, 84, 94] [3, 13, 23, 33, 43, 53, 63, 73, 83, 93] [2, 12, 22, 32, 42, 52, 62, 72, 82, 92] [1, 11, 21, 31, 41, 51, 61, 71, 81, 91] [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] 在本例中,您有一个具有4元素内部表的哈希表。 此哈希表包含7个元素(7个不同的键),但:

键2和键3放在同一个bucket中(它们具有根据散列值计算的相同索引) 钥匙1、5、6放在同一个铲斗上

所以我们可以说,key=2和key=3之间以及key=1,5,6之间存在碰撞。 换句话说,键2和键3位于同一冲突列表中。与键1、5、6相同

无法从哈希表中获取此类冲突列表,因为它是标记为私有的哈希表内部实现:

table index   |  map.entry
0             |  {0, "A"}
1             |  {3, "B"}
2             |  {2, "A"} -> {4, "C"}
3             |  {1, "D"} -> {5, "A} -> {6, "F} 
/**
*哈希表bucket冲突列表条目
*/
私有静态类条目实现Map.Entry{
整数散列;
最终K键;
V值;
进入下一步;
受保护的条目(int散列、K键、V值、下一个条目){
this.hash=hash;
this.key=key;
这个值=值;
this.next=next;
}
...
公共V设置值(V值){
如果(值==null)
抛出新的NullPointerException();
V oldValue=此值;
这个值=值;
返回旧值;
}
...
公共int hashCode(){
返回哈希^value.hashCode();
}
...
}

哈希表的内部存储桶表定义为:

/**
 * Hashtable bucket collision list entry
 */
private static class Entry<K,V> implements Map.Entry<K,V> {

int hash;
final K key;
V value;
Entry<K,V> next;

protected Entry(int hash, K key, V value, Entry<K,V> next) {
    this.hash = hash;
    this.key =  key;
    this.value = value;
    this.next = next;
}

...

public V setValue(V value) {
    if (value == null)
        throw new NullPointerException();

    V oldValue = this.value;
    this.value = value;
    return oldValue;
}

...

public int hashCode() {
    return hash ^ value.hashCode();
}

...
/**
*哈希表数据。
*/
私有瞬态条目[]表;

希望这有助于找出哈希表的行为。

您在示例中观察到的是而不是碰撞效应。这是正常的元件更换。 在100次迭代之后,哈希表中只有10个元素

您使用数字i%10(0,1,…,9)作为键。所以,你只有10把不同的钥匙。 例如:在For循环中,为key=5(i=5,i=15,i=95)输入10个值,每个输入(5,val)替换与key=5关联的旧值

冲突列表是不同的概念。

对于每个键,哈希表计算一些哈希值,并使用此哈希选择其内部bucket表中的索引。接下来将{key,value}放在该索引下。 冲突是指两个不同的键计算了相同的bucket索引的情况

例如:

   Hashtable ht = new Hashtable();
    for (int i = 0; i < 100; i++) {
        ht.put(i%10, i);
    }

    Enumeration< Integer> eles = ht.elements();
    while(eles.hasMoreElements())
        System.out.println(eles.nextElement());
[9, 19, 29, 39, 49, 59, 69, 79, 89, 99] [8, 18, 28, 38, 48, 58, 68, 78, 88, 98] [7, 17, 27, 37, 47, 57, 67, 77, 87, 97] [6, 16, 26, 36, 46, 56, 66, 76, 86, 96] [5, 15, 25, 35, 45, 55, 65, 75, 85, 95] [4, 14, 24, 34, 44, 54, 64, 74, 84, 94] [3, 13, 23, 33, 43, 53, 63, 73, 83, 93] [2, 12, 22, 32, 42, 52, 62, 72, 82, 92] [1, 11, 21, 31, 41, 51, 61, 71, 81, 91] [0, 10, 20, 30, 40, 50, 60, 70, 80, 90] 在本例中,您有一个具有4元素内部表的哈希表。 此哈希表包含7个元素(7个不同的键),但:

键2和键3放在同一个bucket中(它们具有根据散列值计算的相同索引) 钥匙1、5、6放在同一个铲斗上

所以我们可以说,key=2和key=3之间以及key=1,5,6之间存在碰撞。 换句话说,键2和键3位于同一冲突列表中。与键1、5、6相同

你不可能得到这样的柯利犬