草庐IT

哈希表(HashTable)

全部标签

java - java.lang.String 的哈希码真的被缓存了吗?

Strings1="String1";System.out.println(s1.hashCode());//returnanintegeri1Fieldfield=String.class.getDeclaredField("value");field.setAccessible(true);char[]value=(char[])field.get(s1);value[0]='J';value[1]='a';value[2]='v';value[3]='a';value[4]='1';System.out.println(s1.hashCode());//returnsameval

java - 具有两种 O(1) 查找方式的数据结构。哈希表?

我正在实现一个系统,其中我有一个姓名列表,每个人都有1个电话号码。我需要能够输入姓名并查找电话号码,或者输入电话号码并查找姓名。我知道我可以通过两个哈希表来做到这一点-一个从姓名到电话号码,另一个从电话号码到姓名。然后我可以在O(1)时间内向任一方向查找。然而,这似乎是我存储了太多数据-每个姓名和每个电话号码都存储了两次。有什么方法可以更有效地做到这一点?我应该使用什么数据结构来存储姓名和电话号码?如果相关的话,我正在用Java编码。非常感谢! 最佳答案 Java不提供开箱即用的双向哈希表。依赖于两个哈希表的解决方案已经很好了,除非

java - 如何使用 JAXB 将 HashTable<String, String> 序列化为 XML?

我正在尝试使用JAXB序列化HashTable到XML。我是Java的新手(来自C#),所以我对这个任务有点困惑。我看到了下面的代码:publicstaticStringObjectToXml(Tobject,ClassclassType)throwsJAXBException{JAXBContextjaxbContext=JAXBContext.newInstance(classType);StringWriterwriterTo=newStringWriter();Marshallermarshaller=jaxbContext.createMarshaller();marshal

java - 如何使哈希码(整数值)为正

intx=10;inty=(x.hashcode()&0xfffffff);上面的代码怎么总是让ypositive?谢谢! 最佳答案 x.hashcode()&0xfffffff将关闭符号位。此处未使用Math.abs,因为如果x.hashCode等于Integer.MIN_VALUE,它将返回负数,这将使哈希表的数组抛出一个ArrayOutOfBoundException,这不是您想要的。来自@JonSkeet的评论:它不仅会关闭符号位,还会清除接下来的三位。但是对于散列码,我们一直在处理冲突,所以它被认为是好的。

java - 哈希表:为什么get方法是同步的?

我知道Hashtable是同步的,但为什么它的get()方法是同步的?难道只有读方法吗? 最佳答案 如果读取不同步,则可以在读取执行期间修改哈希表。可以添加新元素,底层数组可能变得太小,可以用更大的数组替换等。如果没有顺序执行,很难处理这些情况。但是,即使get不会在Hashtable被另一个线程修改时崩溃,synchronized关键字还有另一个重要方面,即缓存同步。让我们使用一个简化的例子:classFlag{boolvalue;boolget(){returnvalue;}//WARNING:notsynchronizedsy

java - 字符串的哈希码是唯一的吗?

最近,我遇到了一段代码,其中Map被使用,其中Integer(键)是hashCode一些字符串和String对应的值。这是正确的做法吗?因为现在,equals不会为String调用打电话时get.(get也是使用String对象上的hashCode()方法完成的。或者,hashCode(s)对于唯一的字符串是唯一的?我检查了equals欧德String类(class)。有为此编写的逻辑。我很困惑。 最佳答案 HashMap确实使用equals()来比较键。它只使用hashCode()来查找key所在的bucket,因此比equals

java - 为什么 HashMap.put 既比较哈希值又测试相等性?

我分析了Java中的HashMap源码,得到一个关于put方法的问题。JDK1.6中的put方法如下:publicVput(Kkey,Vvalue){if(key==null)returnputForNullKey(value);inthash=hash(key.hashCode());inti=indexFor(hash,table.length);for(Entrye=table[i];e!=null;e=e.next){Objectk;if(e.hash==hash&&((k=e.key)==key||key.equals(k))){VoldValue=e.value;e.val

java - 创建帐户时,如何将密码哈希安全地存储在内存中?

我们基于Web的应用程序将用户帐户绑定(bind)到使用帐户创建期间指定的密码的用户。在Java的情况下,在将其哈希值保存在数据库中之前,如何安全地处理密码。更具体地说,如何确保包含密码的字符串在足够短的时间间隔内被垃圾回收? 最佳答案 如果有可能(在web应用程序中可能比较困难),最好将密码存储在字符数组中,而不是存储在字符串中。如果您完成存储密码,您可以使用Array.fill()在内存中覆盖它。并通过丢弃它使垃圾收集器可以使用该引用:Arrays.fill(password,'');password=null;我只是注意到取消

java - 多线程环境下的 HashMap 和哈希表

我真的很困惑这两个集合在多线程环境中的表现。哈希表是同步的,这意味着不会有2个线程同时更新它的值,对吧? 最佳答案 看ConcurrentHashMaps表示线程安全映射。它们提供了HashTable的所有功能,并且性能非常接近HashMap。性能是通过使用map范围锁而不是使用mapwidelock获得的,默认情况下该集合维护一个包含16个锁的列表,每个锁用于锁定map的一个bucket。您甚至可以配置桶的数量:)根据您的数据调整此项可以帮助提高性能。BrianGoetz的《Java并发实践》我怎么推荐都不为过http://jci

java - 如何创建一个包含字符串和对象哈希表条目的 JList?

我想创建一个包含字符串和对象哈希表条目的JList:HashtableJList元素应包含哈希表条目并显示作为字符串的条目键的值...这可能吗?怎么做到的? 最佳答案 通过扩展AbstractListModel实现ListModel接口(interface)。使用派生模型创建您的JList。另见HowtoUseLists. 关于java-如何创建一个包含字符串和对象哈希表条目的JList?,我们在StackOverflow上找到一个类似的问题: https:/