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
我不确定为什么会这样。首先,不需要键入cast
nHeads
。但我仍然这样做,但它不起作用

注意:我的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
}