gpt4 book ai didi

java - 为什么按需填充集合上的迭代器为空?

转载 作者:行者123 更新时间:2023-11-28 22:31:53 26 4
gpt4 key购买 nike

我有以下代码:

for (String helpId : helpTipFragCache.getKeys())
{
List<HelpTopicFrag> value = helpTipFragCache.getValue(helpId);
helpTipFrags.put(helpId, value);
}

如果值是空的,helpTipFragCache 有一种加载缓存的机制。 getKeys() 方法触发它,并在调用时加载缓存。但是在上述情况下,我看到了不同的行为。

我首先快速调试它以查看缓存是否确实在填充(在 eclipse 中)。我单步执行,但从未进入 for 循环(由于迭代器为空)。

然后我再次调试它(使用相同的代码)并进入 getKeys() 并在那里分析整个过程。然后它完成了所有它应该做的事情,迭代器有了要迭代的值,控制台就平静了。

我已通过更改代码来解决此问题:

Set<String> helpIds = helpTipFragCache.getKeys();
helpIds = helpTipFragCache.getKeys();
for (String helpId : helpIds)
{
List<HelpTopicFrag> value = helpTipFragCache.getValue(helpId);
helpTipFrags.put(helpId, value);
}

显然,调试触发了初始化或行为不同,有人知道是什么原因造成的吗?基本上,从返回的集合创建迭代器会发生什么?

一些其他相关信息:

  • 此代码在服务器启动时执行 (tomcat)
  • 此代码在从包含的 jar 中执行时未按预期运行,但在同一代码库中时运行正常
  • 集合是一个Set

编辑

附加代码:

public Set<String> getKeys() throws Exception
{
if (CACHE_TYPE.LOAD_ALL == cacheType)
{
//Fake a getValue call to make sure the cache is loaded
getValue("");
}
return Collections.unmodifiableSet(cache.keySet());
}

public final T getValue(String key, Object... singleValueArgs) throws Exception
{
T retVal = null;
if (notCaching())
{
if (cacheType == CACHE_TYPE.MODIFY_EXISTING_CACHE_AS_YOU_GO)
{
retVal = getSingleValue(key, null, singleValueArgs);
}
else
{
retVal = getSingleValue(key, singleValueArgs);
}
}
else
{
synchronized (cache)
{
if (needToLoadCache())
{
logger.debug("Need to load cache: " + getCacheName());
if (cacheType != CACHE_TYPE.MODIFY_EXISTING_CACHE_AS_YOU_GO)
{
Map<String, T> newCache = null;
if (cacheType != CACHE_TYPE.MODIFY_EXISTING_CACHE)
{
newCache = getNewCache();
}
else
{
newCache = cache;
}
loadCache(newCache);
cache = newCache;
}
lastUpdatedInMillis = System.currentTimeMillis();
forceLoadCache = false;
}
}
...//code in here does not execute for this example, simply gets a value that is already in the cache
}

return retVal;
}

然后回到原来的类(之前代码发布的地方):

    @Override
protected void loadCache(
Map<String, List<HelpTopicFrag>> newCache)
throws Exception
{
Map<String, List<HelpTopicFrag>> _helpTipFrags = helpDAO.getHelpTopicFrags(getAppName(), _searchIds);
addDisplayModeToFrags(_helpTipFrags);
newCache.putAll(_helpTipFrags);
}

上面,进行了一次数据库调用以获取要放入缓存中的值。

最佳答案

答案

基本上,从返回的集合创建迭代器会发生什么?

在您的案例中,for 循环将 Set 视为 Iterable并使用 Iterator通过调用获得 Iterable.iterator() .

Set as = ...;

for (A a : as) {
doSth ();
}

基本上等同于

Set as = ...;

Iterator hidden = as.iterator ();
while (hidden.hasNext ()) {
a = hidden.next ();
doSth ();
}

关于java - 为什么按需填充集合上的迭代器为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13406582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com