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);
}