Java HashMap重复的桶条目

时间:2011-10-31 12:35:41

标签: java hashmap

我对HashMaps有疑问。我们正在编写一个小c(-ish)编译器,为此我们使用符号表。我们使用hashmap实现这一点。

现在考虑范围我们使用堆栈。所以每当我们进入一个新的范围时,我们就会在堆栈上推送一个表示这个标记的标记。然后,我们将堆栈中的所有键放在堆栈中,用于我们遇到的所有符号。到目前为止一切都很好。

当我们退出范围时,我们会弹出堆栈直到我们到达令牌。在此之前我们传递的每个符号都必须从我们的hashmap中取出。

给出以下代码:

{ 
    a = 5;
    {
        a = 5;
    }
}

hashmap会接受吗?在中,我会使用一个键作为键输入它们。这不会是一个问题,但是当弹出并不得不删除它们时,Java能否在这两个对象之间产生影响?或者第二个会覆盖第一个吗?

4 个答案:

答案 0 :(得分:3)

我认为使用树木是更好的解决方案。树的每个节点定义变量的可见性块。在嵌套块的情况下,叶节点将覆盖变量的值。

答案 1 :(得分:1)

映射javadoc

  

将键映射到值的对象。地图不能包含重复内容   键;每个键最多可以映射一个值。

答案 2 :(得分:1)

不,这不起作用,因为您可能只有一个地图中给定键的值。

我会在范围之间使用委托机制。输入新范围时,创建一个新的Scope对象,并将此范围中定义的每个新符号存储在SCope对象包含的映射中。使Scope对象指向其封闭的Scope(从而委托给这个封闭的Scope来查找不在map中的变量的值),然后使创建的SCope成为当前的。退出块后,只需获取已结束范围的封闭范围,并将其作为当前范围。

答案 3 :(得分:1)

我想建议你2个解决方案。

  1. 地图的用户地图。这就是JNDI的工作原理。每个命名空间可能包含变量本身和子映射本身的子上下文,并且可能包含其级别的变量。
  2. 对键使用点表示法。类似于1.a的第一个变量a在外部上下文中定义,1.1.a表示第二个变量。