我知道有一个WeakHashMap
in java.util
,但是由于它对WeakReference
所有东西都使用s,而这仅由this
Map
引用,因此被引用的对象将在下一个GC周期丢失。因此,如果您要缓存随机数据,这几乎是没有用的,那么很可能会再次请求而无需在其余时间进行硬链接。最好的解决方案是使用SoftReference
s代替的map,但是我在Java
RT Package中找不到。
编辑(2012年8月):
事实证明,目前最好的解决方案可能是Guava
13.0的Cache
类,在Guava的Wiki上进行了解释-
这就是我要使用的。它甚至支持构建一个SoftHashMap
(请参阅参考资料CacheBuilder.newBuilder().softKeys()
),但这可能不是您想要的,正如Java专家Jeremy
Manson解释的那样(在下面您将找到链接)。
我不知道(2008年11月),但是您可以SoftHashMap
在网上找到一些实现。
喜欢这个:SoftHashMap
或者这个。
编辑(2009年11月),
正如Matthias在评论中提到的那样,Google
Guava
MapMaker
确实使用了SoftReferences:
一个
ConcurrentMap
制造商,提供的这些特征的任意组合:
- 软键或弱键,
- 软值或弱值,
- 定时到期,以及
- 按需计算值。
如该线程中所述,另一个JSR166y候选人:
jsr166y.ConcurrentReferenceHashMap
它为Google实现提供了一个替代的并发参考映射(依赖于后台线程逐出条目)
编辑(2012年8月)
Google实现仅在请求条目的过期时间时才使用后台线程。特别是,它仅使用java.util.Timer
,而不像具有单独的后台线程那样具有侵入性。
杰里米·曼森(Jeremy
Manson)建议,对于任何缓存,都应使用此功能以避免SoftReference的危险:http : //jeremymanson.blogspot.de/2009/07/how-
hotspot-decides-to-clear_07.html
Apache
Commons提供了另一种实现,即org.html" target="_blank">apache.commons.collections.map.ReferenceMap
; 它不支持定时删除,但是它支持选择是按身份还是按相等来比较密钥。此外,此实现不是并发的-可以使其同步,但是在来自多个线程的访问下效果不佳。
问题内容: 我想在Java中使用Trie,有没有可以使用的实现?(我尝试寻找一个,但没有找到)。 问题答案: 核心Java库中没有trie数据结构。 这可能是因为尝试通常被设计为存储字符串,而Java数据结构更通用,通常包含任何字符串(定义相等性和哈希操作),尽管有时它们限于 对象(定义顺序)。尽管适用于字符串,但没有通用的“符号序列”抽象,我想您可以为其他类型的符号做些事情。 这是要考虑的另一点
问题内容: 我有一个类似以下的字符串: 现在,我必须20使用字符串来获取结果。 我知道其他一些语言的功能可以做到这一点。如何用Java做到这一点? 问题答案: 您可以使用该类并将其评估为Javascript字符串。 也许有更好的方法,但这是可行的。
问题内容: 我对此感到困惑。我们大多数人都被告知Java中没有goto语句。 但是我发现它是Java中的关键字之一。在哪里可以使用?如果不能使用它,为什么将它作为关键字包含在Java中? 问题答案: James Gosling创建了带有语句支持的原始JVM ,但随后他将该功能移除为不必要。不必要的主要原因是通常可以用更具可读性的语句(如)或将一段代码提取到方法中来代替它。
问题内容: 我有一个类似以下的字符串: 现在,我必须20使用字符串来获取结果。 我知道其他一些语言的功能可以做到这一点。如何用Java做到这一点? 问题答案: 你可以使用ScriptEngine该类并将其评估为Javascript字符串。 也许有更好的方法,但这是可行的。
问题内容: 集合中可以包含两种不同的类型吗?例如,我可以使用List 吗? 问题答案: 简短的答案?号你可以(当然)拥有的,但你可以把 任何东西 在里面,不只是或对象。 您可以创建一个容器对象列表,并且该容器对象将包含or或(可能通过泛型)。多一点麻烦。 并实施和。 当然, 真正的 问题是为什么要这样做?我希望集合包含相同类型的对象,然后我可以遍历这些对象并对其执行操作,而不必担心它们是什么。也许
问题内容: Java中是否有Mutex对象或一种创建对象的方法?我问是因为用1许可初始化的Semaphore对象对我没有帮助。考虑这种情况: 如果在第一次获取时发生异常,则catch块中的释放将增加许可,并且该信号量不再是二进制信号量。 正确的方法是吗? 上面的代码是否可以确保信号量是二进制的? 问题答案: 看到此页面:http : //www.oracle.com/technetwork/art