我在一个程序中得到这个错误,该程序创建了几个(几十万个)HashMap对象,每个对象有几个(15-20)个文本条目.在提交到数据库之前,必须收集这些字符串(不会分解成较小的数量).
根据Sun的说法,如果在垃圾收集中花费了太多时间,则会发生错误:如果超过98%的总时间花在垃圾收集上,并且不到2%的堆被恢复,则会抛出OutOfMemoryError. ".
显然,可以使用命令行将参数传递给JVM
第一种方法工作正常,第二种方法在另一个java.lang.OutOfMemoryError中结束,这次是关于堆的.
所以,问题:对于特定的用例(即几个小的HashMap对象),是否有任何编程替代方案?例如,如果我使用HashMap clear()方法,问题就会消失,但HashMap中存储的数据也会消失!:-)
StackOverflow中的相关主题也讨论了该问题.
提交GitHub.com后,是否有任何在线编辑提交消息的方法?
从命令行,人们可以做到
git commit --amend -m "New commit message"
Run Code Online (Sandbox Code Playgroud)
正如另一个问题中的正确建议.
尝试git pull然后git push工作(没有任何其他提交在平均时间干扰).
但它可以通过GitHub网站完成吗?
尽管在所有项目设置(包括in File -> Project Structure -> Project :: Project SDK)中都指定了JDK 1.7 ,但IntelliJ 13在尝试编译一些使用菱形运算符的简单Java 7代码时会产生以下错误:
java: diamond operator is not supported in -source 1.5
(use -source 7 or higher to enable diamond operator)
Run Code Online (Sandbox Code Playgroud)
配置中是否还有其他位置-source 7应启用预期选项?
在GitHub上是否有任何方法可以在浏览器中列出由单个作者提交的所有提交(既不是本地提交git log,也不是通过API,也不是通过API)?
单击提交列表中的用户名(提交历史记录)只会导致该用户的配置文件页面.检查GitHub UI和搜索(Google,StackOverflow)并未揭示执行此操作的方法.
Java中是否存在使用try/catch块的开销,而不是if块(假设所附的代码没有请求)?
例如,对字符串采用以下两种简单的"安全修剪"方法:
public String tryTrim(String raw) {
try {
return raw.trim();
} catch (Exception e) {
}
return null;
}
public String ifTrim(String raw) {
if (raw == null) {
return null;
}
return raw.trim();
}
Run Code Online (Sandbox Code Playgroud)
如果raw输入很少null,两种方法之间是否有任何性能差异?
此外,使用该方法简化代码布局是一种很好的编程模式tryTrim(),特别是当通过将代码封装在一个try/catch块中可以避免许多if块检查稀有错误条件时?
例如,一个常见的情况是使用一个方法N parameters,M <= N在其开始附近使用它们,如果任何这样的参数是"无效的"(例如,空或空字符串),则快速且确定地失败,而不影响其余的码.
在这种情况下,不必编写k * M if块(其中k每个参数的平均检查次数,例如k = 2对于null或空字符串),try/catch块将显着缩短代码并且可以使用1-2行注释明确地注意到"非常规"逻辑.
这样的模式也会加速该方法,特别是如果错误条件很少发生,并且它会这样做而不会影响程序安全性(假设错误条件是"正常"的,例如在字符串处理方法中为null或空值)是可以接受的,虽然很少存在).
JavavalueOf()为每个Enum<T>对象提供了一个方法,所以给出了enum类似的方法
public enum Day {
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
Run Code Online (Sandbox Code Playgroud)
一个人可以像查找一样
Day day = Day.valueOf("Monday");
Run Code Online (Sandbox Code Playgroud)
如果传递给的字符串valueOf()与现有Day值不匹配(区分大小写),IllegalArgumentException则抛出a.
要进行不区分大小写的匹配,可以在Day枚举中编写自定义方法,例如
public static Day lookup(String day) {
for (Day d : Day.values()) {
if (d.name().equalsIgnoreCase(day)) {
return type;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
是否有任何通用的方法,在不使用值或任何其他额外对象的缓存的情况下,只编写一次lookup()上面的静态方法(即,不是每个enum),假定该values()方法Enum<E>在编译时被隐式添加到类中?
这种"通用" lookup()方法的签名与该方法类似Enum.valueOf(),即:
public static <T extends Enum<T>> T lookup(Class<T> enumType, String name); …Run Code Online (Sandbox Code Playgroud) 我试图解析W3C XML Schema日期,如下所示
"2012-05-15T07:08:09+03:00"
Run Code Online (Sandbox Code Playgroud)
它符合W3C XML Schema dateTime规范的ISO 8601版本.
在上述日期中,时区标识符是"+03:00",但SimpleDateFormat显然不存在表示它的模式.
如果时区是"+0300",那么Z(大写)将是适用的并且SimpleDateFormat模式将是
yyyy-MM-dd'T'HH:mm:ssZ
Run Code Online (Sandbox Code Playgroud)
类似地,如果时区是"GMT+03:00",那么z(小写)将是适用的并且SimpleDateFormat模式将是
yyyy-MM-dd'T'HH:mm:ssz
Run Code Online (Sandbox Code Playgroud)
('Z'顺便说一句,大写也适用).
那么,是否有一种SimpleDateFormat模式或解决方法来表示上述日期而无需预处理日期字符串?
(对于那些熟悉JVM编译和优化技巧的人来说一个问题...... :-)
是否有任何"for"和"foreach"模式明显优于其他模式?
考虑以下两个例子:
public void forLoop(String[] text)
{
if (text != null)
{
for (int i=0; i<text.length; i++)
{
// Do something with text[i]
}
}
}
public void foreachLoop(String[] text)
{
if (text != null)
{
for (String s : text)
{
// Do something with s, exactly as with text[i]
}
}
}
Run Code Online (Sandbox Code Playgroud)
是forLoop快还是慢foreachLoop?
假设在这两种情况下text阵列都不需要进行任何健全性检查,是否有明显的赢家或仍然太接近无法拨打电话?
编辑:正如在一些答案中所指出的,对于数组,性能应该是相同的,而对于像List这样的抽象数据类型,"foreach"模式可能略微更好.另请参阅讨论该主题的答案.
有没有办法在Windows 7 Professional用户点击"关闭"时运行批处理脚本(例如.BAT文件)(不是计划关闭机器的批处理文件,只有在用户点击时才运行的批处理文件) "关掉")?
理想情况下,此类脚本将显示命令提示符窗口并提供取消关闭过程的选项.
不需要第三方实用程序的解决方案更可取.
在Java或任何开源库中是否有任何方法可以转义(不引用)特殊字符(元字符),以便将其用作正则表达式?
这在动态构建正则表达式时非常方便,无需手动转义每个单独的字符.
例如,考虑一个简单的正则表达式\d+\.\d+,它匹配带小数点的数字1.2,以及以下代码:
String digit = "d";
String point = ".";
String regex1 = "\\d+\\.\\d+";
String regex2 = Pattern.quote(digit + "+" + point + digit + "+");
Pattern numbers1 = Pattern.compile(regex1);
Pattern numbers2 = Pattern.compile(regex2);
System.out.println("Regex 1: " + regex1);
if (numbers1.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
System.out.println("Regex 2: " + regex2);
if (numbers2.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
Run Code Online (Sandbox Code Playgroud)
毫不奇怪,上面代码产生的输出是:
Regex 1: \d+\.\d+
Match
Regex 2: \Qd+.d+\E
No match
Run Code Online (Sandbox Code Playgroud)
也就是说, …
java ×7
git ×2
github ×2
batch-file ×1
commit ×1
compilation ×1
date ×1
enums ×1
escaping ×1
for-loop ×1
foreach ×1
g1gc ×1
generics ×1
group-policy ×1
hashmap ×1
heap ×1
heap-memory ×1
if-statement ×1
iso8601 ×1
overhead ×1
performance ×1
post-commit ×1
regex ×1
shutdown ×1
try-catch ×1
windows ×1
windows-7 ×1