【问题标题】:Hashtable in java is giving me the last stored value, but not the right valuejava中的哈希表给了我最后一个存储的值,但不是正确的值
【发布时间】:2009-08-18 13:42:42
【问题描述】:

抱歉,代码有点长,但我需要找到正确的场景。

为什么这段代码会输出所有'C'的?

import java.util.Hashtable;

public class Main {  
    public static ContainsTheHash containsthehash = new ContainsTheHash();  
    public static StoresValues storesvalues = new StoresValues();  
    public static GetsValuesAndPrints getsvaluesandprints = new GetsValuesAndPrints();  
    public static void main(String[] args) {}  

}

class ContainsTheHash {

    Hashtable script_code = new Hashtable();  
    public Contains_The_Hash() {};  
    public void put(long key, Script_Hash_Type sht){script_code.put(key, sht);}  
    public ScriptHashType get(long key){return (Script_Hash_Type)script_code.get(key);}  

}

class ScriptHashType {

     String string;  
     public ScriptHashType(){}  
     public String getstring () {return string;}  
     public void setstring(String str){string = str;}  

}



 class StoresValues {

     public StoresValues(){
         put();
     }
     public void put(){


          ScriptHashType sht = new ScriptHashType();  
          sht.setstring("A");  
          Main.contains_the_hash.put(1,sht);  
          sht.setstring("B");  
          Main.contains_the_hash.put(2,sht);  
          sht.setstring("C");  
          Main.contains_the_hash.put(3,sht);  
     }  

}

class GetsValuesAndPrints {

    public GetsValuesAndPrints(){  

           //should print "A\n B\n  C\n"  
           long temp = 1;  
           System.out.println(get(temp));  
           temp = 2;  
           System.out.println(get(temp));  
           temp = 3;  
           System.out.println(get(temp));  
    };


    public String get(long key){  

        return new String(((Script_Hash_Type)Main.contains_the_hash.get(key)).getstring());  

   }
}

【问题讨论】:

  • 这可能是因为你的 containsthehash 对象是静态的,所以你只有一个实例。所以当你setString时,这是C。但是你的代码不是很清楚
  • 此代码无法编译(Script_Hash_Type 和 ScriptHashType 以及 Contains_The_Hash 和 ContainsTheHas 之间存在混淆)。你能先清理一下这个例子吗?
  • 我认为 LB 是对的,问题是您只使用了 ContainsTheHash 的一个实例。

标签: java scope hashmap hashtable


【解决方案1】:

改变:

ScriptHashType sht = new ScriptHashType();
sht.setstring("A");
Main.contains_the_hash.put(1,sht);
sht.setstring("B");
Main.contains_the_hash.put(2,sht);
sht.setstring("C");
Main.contains_the_hash.put(3,sht); 

ScriptHashType sht = new ScriptHashType();
sht.setstring("A");
Main.contains_the_hash.put(1,sht);
sht = new ScriptHashType();
sht.setstring("B");
Main.contains_the_hash.put(2,sht);
sht = new ScriptHashType();
sht.setstring("C");
Main.contains_the_hash.put(3,sht);

在第一段代码中,您每次都更新同一个对象

【讨论】:

  • 为了解释这一点,集合存储对对象的引用(而不是它们的副本),因此您在哈希中有 3 个对同一对象的引用。
  • 同样的事情我要回复。您更新同一对象中的字符串值。您最终将单个 ScriptHashType 实例设置为“C”,而不是 3 个实例设置为“A”、“B”和“C”。
  • 我同意,这是我的第一条评论。然而,这是一个好的设计吗?我觉得代码很奇怪
  • 大声笑,代码实际上是一个复杂得多的程序的骨架。所以这可以解释为什么它很奇怪。
【解决方案2】:
class StoresValues {

     public StoresValues() {
         put();
     };

     public void put() {
          ScriptHashType sht = new ScriptHashType();  
          sht.setstring("A");  
          Main.contains_the_hash.put(1,sht);  
          sht.setstring("B");  
          Main.contains_the_hash.put(2,sht);  
          sht.setstring("C");  
          Main.contains_the_hash.put(3,sht);  
     }  

你只构建了一个单一的对象,sht,使用 new 操作符。您添加该对象 3 次。该对象上的最后一个 setstring 将字符串设置为“C”。由于只有 1 个对象,因此单个对象的值为“C”。

你应该做的是这样的:

 public void put() {
  ScriptHashType sht = new ScriptHashType();  
  sht.setstring("A");  
  Main.contains_the_hash.put(1,sht);  
  sht = new ScriptHashType();  
  sht.setstring("B");  
  Main.contains_the_hash.put(2,sht);  
  sht = new ScriptHashType();  
  sht.setstring("C");  
  Main.contains_the_hash.put(3,sht);  
 }  

【讨论】:

    【解决方案3】:

    您只需要将 ScriptHashType 的一个实例存储到 Hashtable 中,然后再操作它的值。要获得您期望的行为,您需要创建三个 ScriptHashType 实例,每个实例对应一个所需的值。

    【讨论】:

    • 非常感谢,大家的cmets都非常有帮助,回复也很快。我没有意识到我必须有多个 scripthashtype 实例。我不正确地使用了哈希表。再次感谢
    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2012-02-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多