我有一个包含混合类型的Map,就像这个简单的例子一样
final Map<String, Object> map = new LinkedHashMap<String, Object>();
map.put("a", 1);
map.put("b", "a");
map.put("c", 2);
final Gson gson = new Gson();
final String string = gson.toJson(map);
final Type type = new TypeToken<LinkedHashMap<String, Object>>(){}.getType();
final Map<Object, Object> map2 = gson.fromJson(string, type);
for (final Entry<Object, Object> entry : map2.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
Run Code Online (Sandbox Code Playgroud)
我得到的回报是简单Object的,没有Integer,没有String.输出看起来像
a : java.lang.Object@48d19bc8
b : java.lang.Object@394a8cd1
c : java.lang.Object@4d630ab9
Run Code Online (Sandbox Code Playgroud)
我能以某种方式修复它吗?我希望默认情况下会正确处理这些简单的案例.
我知道,关于类型的信息不能总是被保留,并可能1和"1"手段在JSON完全相同.但是,返回简单的无内容对象对我来说毫无意义.
更新:序列化版本(即 …
从逻辑上讲,它是(但无论何时角色编码或区域设置正在运行,逻辑都无关紧要).根据
perl -e 'print "\n" =~ /\v/ ? "y\n" : "n\n";'
Run Code Online (Sandbox Code Playgroud)
打印"y",它是.根据
Pattern.compile("\\v").matcher("\n").matches();
Run Code Online (Sandbox Code Playgroud)
false在java中返回,它不是.如果没有这个帖子声称,这根本不会让我感到困惑
Sun为JDK7更新的Pattern类有一个奇妙的新标志UNICODE_CHARACTER_CLASS,它使一切正常工作.
但我使用的是java版本"1.7.0_07"并且该标志存在并且似乎根本没有任何改变.此外,"\n"是不是初来乍到的Unicode而是一个普通的老ASCII字符,所以我实在看不出这种差异可能是如何发生的.可能我做的事情很愚蠢,但我看不到.
有什么办法如何让从钥匙(或整个条目)HashMap(或其他合适的Map)有效?
在有人说之前,我从不需要它:我做到了.我有这样的循环
for (long i=0; i<1e12; ++i) {
Key key = new Key(i);
Value value = map.get(key);
if (something(key, value)) list.add(key);
}
Run Code Online (Sandbox Code Playgroud)
key如果我可以用list.add(key)类似的东西 代替list.add(map.getKey(key))(新的实例有资格用于GC),我的不必要的记忆可以保存.虽然它们是相同的,但重用旧实例会节省内存.
我知道我可以将钥匙嵌入价值或使用番石榴Interner; 两者都有帮助,但两者都需要一些记忆.
解决一些误解的评论:如果效率没有问题,可以采取以下措施
Key getKeyFromMap(Key key, Map<Key, ?> map) {
for (Key key2 : map.keySet()) {
if (key.equals(key2)) return key2;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
接受的答案中描述的最有效的解决方案:
public static <K, V> K getKey(K key, HashMap<K, V> map) {
final Entry<K, V> entry = map.getEntry(key); …Run Code Online (Sandbox Code Playgroud) 从铸造Iterable<?>到Iterable<Object>永远安全吗?
它看起来像是,因为我看不出任何方式如何滥用它产生意外ClassCastException,但我想我错过了什么.
标题可能有点强,但让我解释一下我是如何理解会发生什么的.我猜这发生在Tomcat上(引用的消息来自Tomcat),但我不确定了.
TL; DR在底部有一个总结,为什么我声称这是Web服务器的错.
我可能错了(但没有错误的可能性,没有理由问):
ThreadLocalThreadLocal指物体从库ClassLoader网络服务器
如果我理解正确,重新部署后旧的"脏"线程继续被重用.它们ThreadLocal引用了引用它们的旧类,它们ClassLoader指的是整个旧的类层次结构.因此PermGen,随着时间的推移,很多东西都停留在空间中OutOfMemoryError.到目前为止这是对的吗?
我假设有两件事:
因此,在每次重新部署一个完整的线程池更新费一毫秒的一小部分几次每小时,也就是说,还有的时间开销0.0001 * 12/3600 * 100%,即0.000033%.
但是,不是接受这个微小的开销,而是有无数的问题.我的计算错了还是我忽略了什么?
作为警告,我们得到了消息
Web应用程序...使用类型为...的键创建了一个ThreadLocal,并且值为...但在Web应用程序停止时无法将其删除.
应该更好地说明
Web服务器...使用线程池但在停止(或重新部署)应用程序后无法续订.
还是我错了?即使所有线程不时重新创建,时间开销也可以忽略不计.但是ThreadLocal在将它们提供给应用程序之前清除它们就足够了,甚至更快.
有一些真正的问题(最近这个问题),用户无能为力.图书馆作家有时可以而且有时不能.恕我直言,网络服务器可以很容易地解决它.事情发生了并且有原因.所以我责怪唯一一个可以对此采取任何行动的政党.
这个问题的标题比正确的更具挑衅性,但它有其重点.raphw的答案也是如此.这个相关问题有另一个开放的赏金.
我认为Web服务器可以解决它如下:
LastCleanupTimestamp在a中存储a ThreadLocal(对于新线程,它是创建时间)delta,例如1小时)ThreadLocals并设置一个新的LastCleanupTimestamp这将确保没有这样的泄漏存在的时间长于delta加上最长请求的持续时间加上线程周转时间.费用如下:
ThreadLocal每个请求检查一个(即几纳秒) …是否有一个不太复杂的方法来实现使用两个标准的优先级队列?队列获取与2个中创建ComparatorS和提供(除了add)的操作poll1()和poll2(),其中每个删除和返回根据相应的比较器的最小元素.
我的用例是分支定界优化.当您获得无限时间时,以最佳界限扩大候选人可证明是最佳的.假设无限时间可证明是错误的.
严格遵循这一策略通常最终在截止日期到来时根本没有解决方案.一个简单的创可贴首先是将搜索引向解决方案,然后切换到最佳约束策略.这是相当不令人满意的,因为发现的第一个解决方案可能是任意低质量的.
这就是为什么我想使用两个标准队列:在一个步骤中,展开最佳边界候选者,在另一个步骤中,根据一些启发式扩展"最佳外观"候选者.
另一种可能的用途是用于帕累托最优化.
这是一个XY 问题;回答任何部分都可以。
X:我想从单个源代码树中生成多个包。我知道webpack 支持此功能,但恐怕我无法使用它。例如,我的路由器由将路由(字符串)映射到页面(组件)的一个或多个映射提供数据。我将这些地图存储在单独的文件中,并根据需要导入和使用它们(我编写了一个简单的脚本为我做这件事)。
有更好的解决方案吗?
Y:因此,在构建管理包时,无法从. 尽管如此,我还是收到了他们的打字稿错误。即使我创建一个包含错误的新的未使用文件,也会发生同样的情况。index.tsx
如何避免编译未使用的文件?
我不会像我希望的那样在这里发布我的所有配置文件,某处有一个简单的设置。需要的时候我会做的。仅凭这个清单就让我沮丧:
.babelrc
.env
.eslintrc
.gitignore
config-overrides.js
package.json
tsconfig.json
tslint-imports.json
Run Code Online (Sandbox Code Playgroud) 每当我使用嵌套类时,我给它们的名称不包括外部类名,例如,
MySomething.Kind而不是MySomething.MySomethingKind.嵌套类有时对外部可见,然后我想总是通过封闭类限定的名称来引用它们,即,MySomething.Kind而不仅仅是Kind.有时候有多个类包含嵌套Kind,因此使用非限定名称可能会造成混淆.
有没有办法阻止Eclipse不必要地导入mypackage.MySomething.Kind而不是使用(已经导入)mypackage.MySomething和半限定名称?
这不是自发发生的.正如jprete所述,当我总是使用半限定名时,嵌套类不会被导入.但是,任何创建类型变量的重构都只MySomething.Kind声明它Kind并添加不需要的import语句.这会将重构变为无用,因为我必须手动编辑它.每当我忘记时,我都会遇到最糟糕的情况:不合格和半合格的名字.
在这个答案我推荐使用
s.replaceFirst("\\.0*$|(\\.\\d*?)0+$", "$1");
Run Code Online (Sandbox Code Playgroud)
但有两个人抱怨结果包含字符串"null",例如23.null.这可以通过$1(即group(1))存在来解释null,可以将其转换String.valueOf为字符串"null".但是,我总是得到空字符串.我的测试用例涵盖了它
assertEquals("23", removeTrailingZeros("23.00"));
Run Code Online (Sandbox Code Playgroud)
经过.确切的行为是否未定义?
我正在使用类似的链接#!/OrderList?id=123,它显示所有订单的列表和订单123的更多细节.使用reloadOnSearch=false和观看$routeUpdate它工作正常,除了一件事:所有这些链接都被放入浏览器历史记录中,而我更喜欢那里只有一个这样的链接.例如,而不是
#!/OrderList?id=123
#!/OrderList?id=124
#!/OrderList?id=125
#!/AnotherList?id=678
#!/AnotherList?id=679
Run Code Online (Sandbox Code Playgroud)
只是每个组的最后一个成员,即
#!/OrderList?id=125
#!/AnotherList?id=679
Run Code Online (Sandbox Code Playgroud)
我知道$location.replace(),但是当通过一个链接发生变化时我无法看到它放在哪里.我试图将它放入$scope.$on("$routeUpdate", ...),但它没有做任何事情,可能是因为当路线已经改变时为时已晚.
我既不使用router-ui也不使用HTML5模式(只是简单angular-route).
我担心,我不清楚我坚持使用href而不是自定义处理程序.我希望链接能够与鼠标中键和书签以及所有内容一起使用.结合ng-href并可ng-click能做我想要的,但我找到了一个使用普通链接的简单解决方案.