小编pol*_*nts的帖子

什么是microbenchmarking?

我听说过这个术语,但我不完全确定它是什么意思,所以:

  • 它意味着什么,它意味着什么?
  • IS和IS不是微基准测试的一些例子是什么?
  • 微基准测试的危险是什么,你如何避免它?
    • (或者这是件好事吗?)

java optimization performance benchmarking jit

58
推荐指数
4
解决办法
1万
查看次数

泛型方法上的多个通配符使Java编译器(和我!)非常混淆

让我们首先考虑一个简单的场景(请参阅ideone.com上的完整源代码):

import java.util.*;

public class TwoListsOfUnknowns {
    static void doNothing(List<?> list1, List<?> list2) { }

    public static void main(String[] args) {
        List<String> list1 = null;
        List<Integer> list2 = null;
        doNothing(list1, list2); // compiles fine!
    }
}
Run Code Online (Sandbox Code Playgroud)

这两个通配符是不相关的,这就是为什么你可以doNothing用a List<String>和a 调用List<Integer>.换句话说,两者?可以指代完全不同的类型.因此,以下不编译,这是预期的(也在ideone.com上):

import java.util.*;

public class TwoListsOfUnknowns2 {
    static void doSomethingIllegal(List<?> list1, List<?> list2) {
        list1.addAll(list2); // DOES NOT COMPILE!!!
            // The method addAll(Collection<? extends capture#1-of ?>)
            // in the type List<capture#1-of …
Run Code Online (Sandbox Code Playgroud)

java generics compiler-errors wildcard

58
推荐指数
1
解决办法
7197
查看次数

使用明确编号的重复而不是问号,星号和加号

我已经看到使用显式编号重复的正则表达式模式而不是?,*+,即:

Explicit            Shorthand
(something){0,1}    (something)?
(something){1}      (something)
(something){0,}     (something)*
(something){1,}     (something)+
Run Code Online (Sandbox Code Playgroud)

问题是:

  • 这两种形式是否相同?如果添加占有/不情愿修饰符怎么办?
  • 如果它们相同,哪一个更惯用?更具可读性?只是"更好"?

regex readability repeat

54
推荐指数
2
解决办法
4万
查看次数

异常堆栈跟踪中的(未知源)

背景

这个问题与 为什么String.valueOf(null)抛出NullPointerException有关?

请考虑以下代码段:

public class StringValueOfNull {
    public static void main(String[] args) {
        String.valueOf(null);

        // programmer intention is to invoke valueOf(Object), but instead
        // code invokes valueOf(char[]) and throws NullPointerException
    }
}
Run Code Online (Sandbox Code Playgroud)

正如在链接问题的答案中所解释的那样,Java的方法重载将上面的调用解析为String.valueOf(char[]),这NullPointerException在运行时是正确的.

在Eclipse中编译javac 1.6.0_17,这是堆栈跟踪:

Exception in thread "main" java.lang.NullPointerException
        at java.lang.String.<init>(Unknown Source)
        at java.lang.String.valueOf(Unknown Source)
        at StringValueOfNull.main(StringValueOfNull.java:3)
Run Code Online (Sandbox Code Playgroud)

需要注意的是堆栈跟踪上面缺少关键信息:它具备的完整签名valueOf法!它只是说String.valueOf(Unknown Source)!

在我遇到的大多数情况下,异常堆栈跟踪总是具有实际位于堆栈跟踪中的方法的完整签名,这当然对于立即识别问题非常有用,并且是堆栈跟踪的主要原因(不需要首先说是建造相当昂贵的.

然而,在这种情况下,堆栈跟踪根本没有帮助.它在帮助程序员识别问题方面失败了.

按原样,我可以看到程序员可以使用以上代码段识别问题的3种方法:

  • 程序员自己意识到方法是重载的,并且通过解析规则,在这种情况下调用"错误的"重载
  • 程序员使用一个好的IDE,允许他/她快速查看选择的方法
    • 例如,在Eclipse中,鼠标悬停在上面的表达式上会很快告诉程序员String valueOf(char[] data)确实是选中的那个
  • 程序员检查字节码(呃!) …

java exception stack-trace

51
推荐指数
3
解决办法
8万
查看次数

James Gosling解释了为什么Java的字节被签名

我最初感到惊讶的是Java决定指定byte签名,范围从-128..127(包括).我的印象是,大多数8位数字表示都是无符号的,0..255而是一系列的(例如,以点十进制表示的IPv4).

那么詹姆斯·戈斯林有没有被要求解释为什么他决定byte签署?过去权威程序设计语言设计师和/或评论家之间是否就此问题进行了明显的讨论/辩论?

java byte types language-design

50
推荐指数
3
解决办法
7058
查看次数

为什么在null引用上调用(静态)方法不会抛出NullPointerException?

我用Java编写了这个程序

public class Why {

  public static void test() {
    System.out.println("Passed");
  }

  public static void main(String[] args) {
    Why NULL = null;
    NULL.test();
  }

}
Run Code Online (Sandbox Code Playgroud)

我读到调用一个null对象的方法导致NullPointerException,但上面的程序没有?为什么是这样?我不正确地理解某事吗?

java null static nullpointerexception

49
推荐指数
1
解决办法
9709
查看次数

替换字符串中的反向引用语法(为什么是美元符号?)

在Java中,它似乎在少数其他语言,在模式的反向引用由一个反斜杠(如前面\1,\2,\3,等),但在替换字符串他们一个美元符号前面(例如$1,$2,$3,和也$0).

这是一个片段来说明:

System.out.println(
    "left-right".replaceAll("(.*)-(.*)", "\\2-\\1") // WRONG!!!
); // prints "2-1"

System.out.println(
    "left-right".replaceAll("(.*)-(.*)", "$2-$1")   // CORRECT!
); // prints "right-left"

System.out.println(
    "You want million dollar?!?".replaceAll("(\\w*) dollar", "US\\$ $1")
); // prints "You want US$ million?!?"

System.out.println(
    "You want million dollar?!?".replaceAll("(\\w*) dollar", "US$ \\1")
); // throws IllegalArgumentException: Illegal group reference
Run Code Online (Sandbox Code Playgroud)

问题:

  • $在Java中特有的替换字符串中使用反向引用是什么?如果没有,用什么语言开始呢?什么口味使用它,什么不使用?
  • 为什么这是个好主意?为什么不坚持使用相同的模式语法?这不会导致更具凝聚力和更容易学习的语言吗?
    • 如果上面的语句1和4是"正确的"而不是2和3,语法是否会更加简化?

java regex syntax backreference replace

47
推荐指数
2
解决办法
3万
查看次数

多次返回:哪一个设置最终返回值?

鉴于此代码:

String test() {
    try {
        return "1";
    } finally {
        return "2";
    }
}
Run Code Online (Sandbox Code Playgroud)

语言规范是否定义了调用的返回值test()?换句话说:每个JVM中它总是一样的吗?

在Sun JVM中,返回值是2,但我想确定,这不依赖于VM.

java return finally

46
推荐指数
5
解决办法
6117
查看次数

为什么Java中的String类没有实现Iterable?

许多Java框架类实现Iterable,但String不实现.迭代a中的字符是有意义的String,就像可以迭代常规数组中的项一样.

有没有理由String不实施Iterable

java string iterable

45
推荐指数
3
解决办法
1万
查看次数

是否有O(n)整数排序算法?

上周我偶然发现了这篇论文,作者在第二页提到:

请注意,这会产生整数边权重的线性运行时间.

第三页上的内容相同:

这产生整数边缘权重的线性运行时间和基于比较的排序的O(m log n).

在第8页:

特别是,使用快速整数排序可能会显着加速GPA.

这是否意味着在特殊情况下存在整数值的O(n)排序算法?或者这是图论的专长?

PS:
可能参考文献[3]可能会有所帮助,因为在第一页上他们说:

[...]图表类已经实现了进一步的改进,例如整数边权重[3],[...]

但是我无法访问任何科学期刊.

language-agnostic sorting algorithm time-complexity

43
推荐指数
3
解决办法
4万
查看次数