Hashtable Java中的Long问题
显然,我无法在哈希表中存储长值 请参阅下面的代码:Hashtable Java中的Long问题,java,hashtable,long-integer,Java,Hashtable,Long Integer,显然,我无法在哈希表中存储长值 请参阅下面的代码: //create a hashtable of type <String, Long> Hashtable <String, Long> universalTable = new Hashtable <String, Long> (); universalTable.put("HEADS", new Long(0)); // this works fine 内部DoFlip: DoFlip doFlip
//create a hashtable of type <String, Long>
Hashtable <String, Long> universalTable = new Hashtable <String, Long> ();
universalTable.put("HEADS", new Long(0)); // this works fine
内部DoFlip
:
DoFlip doFlip = new DoFlip(100000000, universalTable);
Hashtable table; // pointer to hash map
long iterations = 0; // number of iterations
DoFlip(long iterations, Hashtable table){
this.iterations = iterations;
this.table = table;
}
这个类实现了Runnable。run()
方法如下-
public void run(){
while(this.iterations > 0){
// do some stuff
this.heads ++;
this.iterations --;
}
updateStats();
}
public void updateStats(){
Long nHeads = (Long)this.table.get("HEADS");
this.table.put("HEADS", nHeads); // ISSUE HERE
}
我收到以下警告/错误。看起来是个警告,但我不想这样
Note: File.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
当我重新编译时:
File.java:92: warning: [unchecked] unchecked call to put(K,V) as a member of the raw type java.util.Hashtable
this.table.put("HEADS", nHeads);
^
1 warning
我不确定为什么会这样。首先,不需要键入castnHeads
。但我仍然这样做,但它不起作用
注意:我的Java语言一点也不好/
感谢您的帮助。此警告表示您正在使用原始类型。替换
DoFlip(long iterations, Hashtable table){
与
DoFlip(长迭代,哈希表){
这样它就包含了类似于universalTable
的泛型。在初始声明中也包括泛型
旁注:
是一个非常古老的Hashtable
,已被集合
取代HashMap
Hashtable table;
Hashtable table;
为了
哈希表;
在DoFlip
我的2美分内的声明中:
首先,如果您正在构建一些性能敏感的应用程序,并且希望避免长基元和长基元之间的转换,请考虑使用集合库。 其次,您的DoFlip应该声明为
DoFlip(long iterations, Hashtable<String, Long> table){
this.iterations = iterations;
this.table = table;
}
DoFlip(长迭代,哈希表){
this.iterations=迭代次数;
this.table=表格;
}
问题解决了
享受。您需要向编译器保证,您的哈希映射都是从字符串到长字符串的。您在这里做到了:
Hashtable <String, Long> universalTable = new Hashtable <String, Long> ();
我们也要这样做:
Hashtable<String, Long> table;
---
DoFlip(long iterations, Hashtable<String, Long> table){
哈希表;
---
DoFlip(长迭代,哈希表){
…而且不会再有自动恐慌,因为在运行时您会将错误类型的对象放入
表中
,因为现在编译器可以检查您是否始终使用您想要的对象(即括号中指定的对象).这只是编译器发出的警告,您将混合使用泛型和非泛型容器
您可以执行以下任一步骤使其消失
1) 你需要改变
Hashtable table;
Hashtable table;
为了
hashtable在DoFlip中不是通用的,警告也不是错误。“hashtable在DoFlip中不是通用的”您能详细说明一下吗?另外,我确实理解它是一个警告(正如我提到的)。我想了解为什么会发生这种情况。@DaveNewton:明白了。非常感谢。是的,我正在构建一个基于性能的应用程序。我会留意trove4j。谢谢。这也很有帮助。我有两个通用声明。谢谢。感谢各位。至于
DoFlip
而不是DoFlip
,DoFlip
是一个静态类,t因此,这也是构造器。
Hashtable table;
Hashtable<String, Long> table;
@SuppressWarnings("unchecked")
public void updateStats(){
Long nHeads = (Long)this.table.get("HEADS");
this.table.put("HEADS", nHeads); // ISSUE HERE
}