在Java中覆盖String哈希函数

时间:2011-06-20 22:35:15

标签: java

没有任何运气找到这个,但我试图覆盖Java中的String func。我正在使用给定的源代码进行字典搜索,它是如何工作的,它基本上是哈希所有的单词。虽然如此,“HI”和“hi”不是同一个词。我认为最简单的方法是为String编写自己的哈希函数,以便“hi”然后在字典中哈希并显示“Hi”。我该怎么做?

4 个答案:

答案 0 :(得分:4)

您创建一个具有单个字段的类,即String。

您的类上的@Override等于和hashCode做了不区分大小写的事情。

您可以将类的对象存储在HashSet或HashTable或其他任何内容中。

答案 1 :(得分:4)

与@ Oli相似,但无需拨打电话之前的案例

public class CaseInsensitiveMap<V> implements Map<String, V> {  

  private final Map<String, V> map;  

  public CaseInsensitiveMap(Map<String, V> map) {  
    this.map = map;  
  }  

  public V put(String key, V value) {  
    return map.put(key.toLowerCase(), value);  
  }  

   /// etc...
}  

答案 2 :(得分:2)

在运行哈希函数之前调用String.toUpperCase()

答案 3 :(得分:1)

这个想法有三个缺点:它是坏的,不可能的和不必要的。

这是不可能的,因为java.lang.String是最终的。你不能从它继承,所以你不能覆盖任何方法。

这有两个方面的不好:首先是因为你会改变其中一个核心类的合同和行为。能够传递一个不像String那样的String实例可能会破坏任何东西。其次,我明白要做你想做的事你也必须重写等于 - 这将以非对称等于(其中a.equals(b)!= b.equals(a)以防a或者其中之一b是一个普通的字符串,一个是你的特殊版本)。我认为不区分大小写的字符串等于普通字符串实际上是布洛赫“有效Java”中一个非常糟糕的想法的例子。

这是不必要的,因为你需要的是一个持有String并委托给它的对象。它也可以有一个构造函数或一个采用普通字符串的静态工厂方法。或者不区分大小写的地图。其他答案中有很多例子。