Java 为什么我的hashmap会被最后添加的值覆盖?

Java 为什么我的hashmap会被最后添加的值覆盖?,java,hashmap,Java,Hashmap,我被我的项目打动了。。。必须维护lang数组的大型哈希映射。。。。我尝试了这个样品,但它不工作。。。。我无法将密钥存储在数组中。。。。先谢谢你 class K{ int key; } class V{ int data; } class hashmp{ public static void main(String args[]){ HashMap<K,V> hm=new HashMap<K,V>(); K key1=new K(

我被我的项目打动了。。。必须维护lang数组的大型哈希映射。。。。我尝试了这个样品,但它不工作。。。。我无法将密钥存储在数组中。。。。先谢谢你

class K{
  int key;
}

class V{
  int data;
}

class hashmp{
  public static void main(String args[]){
       HashMap<K,V> hm=new HashMap<K,V>();
       K key1=new K();
       for(int i=0;i<5;i++){    
         V val=new V();
         key1.key=i;
         val.data=i+5;
         hm.put(key1,val);
       }
       System.out.println();
       for(int i=0;i<5;i++){
         key1.key=i;
         V pt=hm.get(key1);
         System.out.println("\n"+hm.containsKey(key1)+key1.key);    
         if(hm.containsKey(key1))       
            System.out.print(pt.data);
       }
   }
 }
更新的代码

   class K{ 
       long key;   
   }   

   class V{ 
      long[] v=new long[10];      
  }                                   

  public void  putHash(V val1){      
         //some code         
     V s=new V();               
     K gt=new K();            
     gt.key=val1.v[0];                
    if(hm.containsKey(keyArr[(int)gt.key])){         
                 s=hm.get(gt);    //get value of key if exists              
       //some code to modify s               
    }                 
   gt.key=val1.v[0];             
   hm.put(gt,s);  // put the modified value back to same key    
}      

谢谢大家为我提供答案。。。最后它工作得很好。。。感谢大家的贡献……

HashMap存储密钥的引用。因此,如果您更改密钥,它将在HashMap中更改。如果要更改此选项,请移动station
K key1=new K()在for循环内。

首先执行以下操作:

HashMap<K, V> hm = new HashMap<K, V>();
            K key1 = null;
            for (int i = 0; i < 5; i++) {
                key1 =new K();
                V val = new V();
                key1.key = i;
                val.data = i + 5;
                hm.put(key1, val);

            }
您将得到正确的值

或者,您也可以参考此答案,了解如何遍历键或值

给我一些反馈


希望有帮助

您在每次循环迭代中使用相同的
kkey1
对象,并且您正在修改相同的对象,即使它已经在映射中。您需要为映射中的每个条目创建一个不同的键
K
(或者直接使用
Integer
,而不是创建您自己的键类,它至少需要一个
equals
hashCode
),或者,如果您正在按顺序编号,只需要一个数组:
V vals[]

对于您在地图中放置的每个条目,您必须实例化该键,否则您的最后一个条目将被覆盖。

您只有一个
key
类的实例,因此它们都相等(默认实现
equals
方法的第一个条件是相同的对象)。在循环中移动
newkey()
,一切都会正常进行(顺便说一句,为映射键重写
equals
方法要好得多)。这是否足以使用get()方法查找我的条目。。。。我想检索特定键的数据……他一直使用同一个键对象;地图中只有一个条目,这会让他进行迭代,所以它回答了问题,但是因为他在他的键上使用了引用相等,所以他在进行任何查找时都会遇到困难;在这类问题上,如果可以的话,回答基本问题(在本例中,编写他自己的
int
wrapper)是很有帮助的。我必须为每个键存储长数组作为hashmap的值。。。。HashMap hm=新的HashMap。。。我还想修改数组中的单个元素(例如:要在一个键下单独修改的数据[3]),并将它们存储回hashmap中。。。。迭代器在这种情况下有用吗。。。。提前谢谢。。
HashMap<K, V> hm = new HashMap<K, V>();
            K key1 = null;
            for (int i = 0; i < 5; i++) {
                key1 =new K();
                V val = new V();
                key1.key = i;
                val.data = i + 5;
                hm.put(key1, val);

            }
Iterator it = hm.entrySet().iterator();
            while (it.hasNext()) {
                Map.Entry pairs = (Map.Entry)it.next();
                System.out.println(((K)pairs.getKey()).key + " = " + ((V)pairs.getValue()).data);

                it.remove(); // avoids a ConcurrentModificationException
            }