English 中文(简体)
Java 链接的HashSet 索引有效性
原标题:Java LinkedHashSet index validity

我一直在把一大块 Java 代码移植到 C++, 并且不得不执行类似 LinkedHashSet 的东西。 我用 Bust s 多 Index 容器制作了链接HashSet/ Map 的合理传真 。

当我在输入代码时,我正用多指数进入一些有趣的东西,因为包含的物体是不可变的(除非您将该类的特定字段标记为可变的 ) 。 但是,如果密钥是从包含的类别中某些可变成员计算出来的,那么事情就会变得有趣。

为了澄清一些我认为我在爪哇写了一个微不足道的例子来检查他们的链接HashSet的行为。结果对我来说有点令人吃惊;它们似乎表现得像BOSTS多指数容器,因为如果一个包含的物体被修改(你可能会期待如此),指数就不会再生;然而,编译者并没有以任何方式抱怨 -- -- 似乎很容易射穿自己的脚(我所输入的代码似乎犯下了所提到的罪恶,谁知道它是如何运作的)。

这仅仅是对爪哇缺乏康斯特-辩论者的限制吗? 还是我做了一件特别愚蠢或棘手的事?

以下是一个微不足道的例子:

class StringContainer                                                        
{                                                                            
    public String s;                                                         

    public StringContainer(String s)                                         
    {                                                                        
        this.s = s;                                                          
    }                                                                        

    public boolean equals(Object t1)                                         
    {                                                                        
        StringContainer other = (StringContainer) t1;                        
        return this.s == other.s;                                            
    }                                                                        

    public int hashCode()                                                    
    {                                                                        
        int val = 8;                                                         
        for (int i = 0; i < s.length(); i++)                                 
            val += s.charAt(i);                                              
        return val;                                                          
    }                                                                        

    public String toString()                                                 
    {                                                                        
        return s;                                                            
    }                                                                        
}                                                                            

class test                                                                   
{                                                                            
    public static void main(String[] args)                                   
    {                                                                        
        Set<StringContainer> set = new LinkedHashSet();                      
        set.add(new StringContainer("Foo"));                                 
        set.add(new StringContainer("Bar"));                                 
        set.add(new StringContainer("Baz"));                                 
        set.add(new StringContainer("Qux"));                                 


        Iterator<StringContainer> it = set.iterator();                       
        while (it.hasNext())                                                 
        {                                                                    
            StringContainer s = it.next();                                   
            if (s.s == "Baz")                                                
                s.s = "Baz2";                                                
            System.out.println(s);                                           
        }                                                                    

        System.out.println("
Re-iterate:
");                               

        it = set.iterator();                                                 
        while (it.hasNext())                                                 
        {                                                                    
            StringContainer s = it.next();                                   
            System.out.println(s);                                           
        }                                                                    

        System.out.println();                                                

        if (set.contains(new StringContainer("Foo")))                        
            System.out.println("Contains Foo");                              

        if (set.contains(new StringContainer("Baz")))                        
            System.out.println("Contains Baz");                              
        else                                                                 
            System.out.println("Does not contain Baz");                      

        if (set.contains(new StringContainer("Baz2")))                       
            System.out.println("Contains Baz2");                             
        else                                                                 
            System.out.println("Does not contain Baz2");                     
    }                                                                        
}

它印刷了以下材料:

Foo
Bar
Baz2
Qux

Re-iterate:

Foo
Bar
Baz2
Qux

Contains Foo
Does not contain Baz
Does not contain Baz2

有趣的是,它知道巴兹已经改变;然而它仍然没有找到巴兹2号。

显然,这是个构思,但我所看到的非常可信的代码似乎(通过多重间接法)导致了这个问题。 至少用“促进多指数 ” ( move multic index ), 您必须把一个循环器编织成一个循环器才能造成这个问题!

最佳回答
问题回答

请注意, LinkedHashSet 延伸了 HashSet ,它只是覆盖一个只关心其密钥的 HashMap 。 因此,我们在这里真正谈论的是 HashMap 的行为。

Hashmap 只是保留其密钥的引用, 并且不负责跟踪这些对象的更改发生时。 只有当密钥是 put 或当 Hashmap 调整大小时, 它才会计算这些密钥的支流 。

从理论上讲,跟踪钥匙变化的自定义哈什马普实施是可能的,但这将取决于安装接口的钥匙,在特性改变时发出通知。这个自定义的哈什马普只能与特定类型的钥匙一起使用,这一事实会使它变得非常专业化。





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签