我听说过这个术语,但我不完全确定它是什么意思,所以:
让我们首先考虑一个简单的场景(请参阅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) 我已经看到使用显式编号重复的正则表达式模式而不是?,*和+,即:
Explicit Shorthand
(something){0,1} (something)?
(something){1} (something)
(something){0,} (something)*
(something){1,} (something)+
Run Code Online (Sandbox Code Playgroud)
问题是:
请考虑以下代码段:
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种方法:
String valueOf(char[] data)确实是选中的那个我最初感到惊讶的是Java决定指定byte签名,范围从-128..127(包括).我的印象是,大多数8位数字表示都是无符号的,0..255而是一系列的(例如,以点十进制表示的IPv4).
那么詹姆斯·戈斯林有没有被要求解释为什么他决定byte签署?过去权威程序设计语言设计师和/或评论家之间是否就此问题进行了明显的讨论/辩论?
我用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中,它似乎在少数其他语言,在模式的反向引用由一个反斜杠(如前面\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中特有的替换字符串中使用反向引用是什么?如果没有,用什么语言开始呢?什么口味使用它,什么不使用?鉴于此代码:
String test() {
try {
return "1";
} finally {
return "2";
}
}
Run Code Online (Sandbox Code Playgroud)
语言规范是否定义了调用的返回值test()?换句话说:每个JVM中它总是一样的吗?
在Sun JVM中,返回值是2,但我想确定,这不依赖于VM.
许多Java框架类实现Iterable,但String不实现.迭代a中的字符是有意义的String,就像可以迭代常规数组中的项一样.
有没有理由String不实施Iterable?
上周我偶然发现了这篇论文,作者在第二页提到:
请注意,这会产生整数边权重的线性运行时间.
第三页上的内容相同:
这产生整数边缘权重的线性运行时间和基于比较的排序的O(m log n).
在第8页:
特别是,使用快速整数排序可能会显着加速GPA.
这是否意味着在特殊情况下存在整数值的O(n)排序算法?或者这是图论的专长?
PS:
可能参考文献[3]可能会有所帮助,因为在第一页上他们说:
[...]图表类已经实现了进一步的改进,例如整数边权重[3],[...]
但是我无法访问任何科学期刊.
java ×8
regex ×2
algorithm ×1
benchmarking ×1
byte ×1
exception ×1
finally ×1
generics ×1
iterable ×1
jit ×1
null ×1
optimization ×1
performance ×1
readability ×1
repeat ×1
replace ×1
return ×1
sorting ×1
stack-trace ×1
static ×1
string ×1
syntax ×1
types ×1
wildcard ×1