-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Interner zh CN
Ben Manes edited this page Apr 28, 2022
·
4 revisions
Interner<String> interner = Interner.newStrongInterner();
String s1 = interner.intern(new String("value"));
String s2 = interner.intern(new String("value"));
assert s1 == s2
一个 Interner
将会返回给定元素的标准规范形式。当调用 intern(e)
方法时,如果该 interner 已经包含一个由 Object.equals
方法确认相等的对象的时候,将会返回其中已经包含的对象。否则将会新添加该对象返回。这种重复数据删除通常用于共享规范实例来减少内存使用。
LoadingCache<Key, Graph> graphs = Caffeine.newBuilder()
.weakKeys()
.build(key -> createExpensiveGraph(key));
Interner<Key> interner = Interner.newWeakInterner();
Key canonical = interner.intern(key);
Graph graph = graphs.get(canonical);
一个弱引用的 interner 允许其中的内部对象在没有别的强引用的前提下在被 gc 回收。与 caffeine 的 Caffeine.weakKeys()
不同的是,
这里通过 (==) 来进行比较而不是 equals()
。这样可以确保应用程序所引用的 interner 中的值正是缓存中的实际实例。否则在缓存当中的所
持有的弱引用 key 很有可能是与应用程序所持有的实例不同的实例,这会导致这个 key 会在 gc 的时候被提早从缓存当中被淘汰。