我找不到Java 7的文档,我只能找到关于Java 6的文档,它仍然可以快速或合并.有谁知道如何Arrays.sort
在Java 7中找到该方法的文档?
警告#1:这实际上是一个潜在的两个部分:首先,私有内部类的构造函数是否具有形式参数?如果是的话,为什么JLS说不呢?如果不是,怎么/为什么不呢?
警告#2:这个问题不适合猜测.我只是在寻找权威的答案.
默认构造函数在JLS 8.8.9中定义,它声明(部分):
默认构造函数没有形式参数,除非在非私有内部成员类中,默认构造函数隐式声明一个形式参数,表示该类的直接封闭实例(§8.8.1,§15.9.2,§15.9.3) ).
(重点补充)
"非私有"位对我来说似乎很奇怪:为了让内部类访问其封闭类中定义的字段,它需要对该实例的引用.无论内部类是否为私有,这都应该是相同的.
事实上,javac似乎与我一致,与规范相矛盾.如果我编译这个:
public class Ctors {
private class MyInner {
}
}
Run Code Online (Sandbox Code Playgroud)
...然后运行javap -c -private
,然后我们看到一个带有单个形式参数的构造函数,用于封闭类的实例:
$ javap -c -private Ctors\$MyInner
Compiled from "Ctors.java"
class Ctors$MyInner {
final Ctors this$0;
private Ctors$MyInner(Ctors);
Code:
0: aload_0
1: aload_1
2: putfield #1 // Field this$0:LCtors;
5: aload_0
6: invokespecial #2 // Method java/lang/Object."<init>":()V
9: return
}
Run Code Online (Sandbox Code Playgroud)
作为参考,这是在Oracle JDK 1.8.0_05上.
所以JLS说私有内部成员类的默认构造函数没有正式参数,但javac/javap说它有一个.(我对最自然的工作方式的理解也会说它应该有一个,对于那些值得的东西.)哪个是正确的,为什么JLS明确排除私人内部类?
问题的关键是,为什么这会导致编译时错误?
List<Collection> raws = new ArrayList<Collection>();
List<Collection<?>> c = raws; // error
Run Code Online (Sandbox Code Playgroud)
我理解为什么泛型一般不协变.如果我们能够分配List<Integer>
到List<Number>
,我们会暴露自己ClassCastExceptions异常:
List<Integer> ints = new ArrayList<Integer>();
List<Number> nums = ints; // compile-time error
nums.add(Double.valueOf(1.2));
Integer i = ints.get(0); // ClassCastException
Run Code Online (Sandbox Code Playgroud)
我们在第2行得到一个编译时错误,以避免我们从第4行的运行时错误.这是有道理的.
List<C>
至 List<C<?>>
但是这个怎么样:
List<Collection> rawLists = new ArrayList<Collection>();
List<Collection<?>> wildLists = rawLists; // compile-time error
// scenario 1: add to raw and get from wild
rawLists.add(new ArrayList<Integer>());
Collection<?> c1 = wildLists.get(0);
Object o1 = c1.iterator().next();
// scenario 2: add to wild …
Run Code Online (Sandbox Code Playgroud) 我想实现一个共享对象来计算操作执行的统计信息.对象状态将由Map<String,AtomicInteger>
(键是操作名称,值是操作执行的次数)表示.我是否正确我可以选择一个HashMap<String,AtomicInteger>
实现并且不使用它来从中获取值,因为AtomicInteger value
下面有一个volatile 字段.
执行统计数据添加和增加的代码示例:
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
public final class Stats {
private final Map<String, AtomicInteger> statistics = new HashMap<String, AtomicInteger>();
public int increment(String operationName) {
if (!statistics.containsKey(operationName)) {
synchronized (statistics) {
if (!statistics.containsKey(operationName))
statistics.put(operationName, new AtomicInteger(0));
}
}
return statistics.get(operationName).getAndIncrement();
}
public int getOpStats(String operationName) {
if (!statistics.containsKey(operationName)) {
return 0;
}
return statistics.get(operationName).get();
}
}
Run Code Online (Sandbox Code Playgroud) 根据Java文档:
最常用的类型参数名称是:
E - Element(Java Collections Framework广泛使用)
K - 钥匙
N - 数字
T型
V - 价值
S,U,V等 - 第2,第3,第4类型
但是,我看过这样的代码
public <R> Observable<R> compose(Transformer<? super T, ? extends R> transformer) {
return ((Transformer<T, R>) transformer).call(this);
}
Run Code Online (Sandbox Code Playgroud)
这里是使用R,从哪个来源我可以找到R在这里的含义?
我试图使用JProfiler配置使用lambdas的Java应用程序.我无法识别,探查器将哪个lambda显示为热点:
我很感激任何帮助理解涉及lambdas的堆栈跟踪的格式,如"edu.indiana.soci.spidal.vectorclass.lambda $ PairwiseThread_SecDrv $ 23"
谢谢!
这是我要调用/调用的方法.
public static <N,E> void doGenericStatic2(N number, E element) {
System.out.println(number);
System.out.println(element);
}
Run Code Online (Sandbox Code Playgroud)
这是我测试调用前一个方法的方法(两者都位于同一个类中MyClass
)
public static void testInvokeGenericMethodLocally() {
doGenericStatic2(100, "Text");
// <Integer,String>doGenericStatic2(100, "Text"); //Syntax error, insert "super ( ) ;" to complete Statement
MyClass.doGenericStatic2(100, "Text");
MyClass.<Integer,String>doGenericStatic2(100, "Text");
}
Run Code Online (Sandbox Code Playgroud)
为什么这种特殊情况(第二次调用测试)会<Integer,String>doGenericStatic2(100, "Text");
产生编译时错误?
我想测试Java WeakHashMap类功能,为此我编写了以下测试:
public class WeakHashMapTest {
public static void main(String args[]) {
Map<String, Object> weakMap = new WeakHashMap<>();
String x = new String("x");
String x1 = new String("x1");
String x2 = new String("x2");
weakMap.put(x, x);
weakMap.put(x1, x1);
weakMap.put(x2, x2);
System.out.println("Map size :" + weakMap.size());
// force all keys be eligible
x=x1=x2=null;
// call garbage collector
System.gc();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Map size :" + weakMap.size());
System.out.println("Map :" + weakMap);
}
}
Run Code Online (Sandbox Code Playgroud)
运行WeakMapTest类后,我得到以下输出令人不快惊讶:
gc前的地图:{x = …
是否可以在完成所有线程之前从启动线程的java方法返回?
这是我的代码:
import java.util.concurrent.*;
public class ExecutorSample {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
service.execute(() -> {
while (true) {
}
});
}
return;
}
}
Run Code Online (Sandbox Code Playgroud)
由于我不理解的某些原因,这不会返回.为什么主线程的返回受到工作线程卡住的影响?
java ×10
generics ×3
arrays ×1
java-8 ×1
jprofiler ×1
lambda ×1
sorting ×1
threadpool ×1
timsort ×1
weakhashmap ×1