Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/122.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的Hashtable给了我最后存储的值,但不是正确的值_Java_Scope_Hashmap_Hashtable - Fatal编程技术网

java中的Hashtable给了我最后存储的值,但不是正确的值

java中的Hashtable给了我最后存储的值,但不是正确的值,java,scope,hashmap,hashtable,Java,Scope,Hashmap,Hashtable,抱歉,这段代码有点长,但我需要得到正确的场景 为什么此代码输出所有的'C' import java.util.Hashtable; public class Main { public static ContainsTheHash containsthehash = new ContainsTheHash(); public static StoresValues storesvalues = new StoresValues(); public stati

抱歉,这段代码有点长,但我需要得到正确的场景

为什么此代码输出所有的
'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());  

   }
}
更改:

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 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。将该对象添加3次。该对象上的最后一个setstring将字符串设置为“C”。由于只有一个对象sht,因此单个对象的值为“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);  
 }  

您只将ScriptHashType的一个实例存储到哈希表中,然后处理其值。要获得您期望的行为,您需要创建ScriptHashType的三个实例,每个所需的值一个。

为了解释这一点,集合存储对对象的引用(而不是它们的副本),因此哈希中有3个对同一对象的引用。我将回答同样的问题。您正在更新同一对象中的字符串值。最后一个ScriptHashType实例设置为“C”,而不是3个实例设置为“a”、“B”和“C”。我同意,这是我的第一个评论。然而,这是一个好的设计吗?我发现代码真的很奇怪,代码实际上是一个复杂得多的程序的骨架。这也许可以解释为什么它是wierd。这可能是因为你的contains散列对象是静态的,所以你只有一个实例。因此,当您设置字符串时,这是C。但是您的代码不是很清晰。这段代码没有编译(脚本\u Hash\u类型和脚本hashtype之间存在混淆,并且包含\u Hash和containsHas)。你能先清理一下这个例子吗?我认为LB是对的,问题是你只使用了ContainesHash的一个实例。非常感谢,每个人的评论都非常有用,而且回复也很快。我没有意识到我必须有多个scripthashtype实例。我不正确地使用了哈希表。再次感谢
 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);  
 }