假设我有一个使用lambda表达式(闭包)定义的对象列表.有没有办法检查它们,以便可以进行比较?
我最感兴趣的代码是
List<Strategy> strategies = getStrategies();
Strategy a = (Strategy) this::a;
if (strategies.contains(a)) { // ...
Run Code Online (Sandbox Code Playgroud)
完整的代码是
import java.util.Arrays;
import java.util.List;
public class ClosureEqualsMain {
interface Strategy {
void invoke(/*args*/);
default boolean equals(Object o) { // doesn't compile
return Closures.equals(this, o);
}
}
public void a() { }
public void b() { }
public void c() { }
public List<Strategy> getStrategies() {
return Arrays.asList(this::a, this::b, this::c);
}
private void testStrategies() {
List<Strategy> strategies = getStrategies();
System.out.println(strategies);
Strategy a = (Strategy) …Run Code Online (Sandbox Code Playgroud) 有没有人看过[]像这样的方法签名后放置的数组?
public static String mySplit(String s)[] {
return s.split(",");
}
public static void main(String... args) {
String[] words = mySplit("a,b,c,d,e");
System.out.println(Arrays.toString(words));
}
Run Code Online (Sandbox Code Playgroud)
版画
[a, b, c, d, e]
Run Code Online (Sandbox Code Playgroud)
在过去,奇怪的符号一直是"C"兼容性,但我不会想象有人在C中写这个.
有谁知道为什么这甚至被允许?
我正在使用Java 7更新10,以防万一.
这在Java 6中也是如此.http://ideone.com/91rZV1
BTW这不编译,我也不期望它
public static <T> List mySplit(String s)<T> {
return Collections.emptyList();
}
Run Code Online (Sandbox Code Playgroud) 我有一个疑问,Java代码中未使用的导入和未使用的对象是否会产生任何性能影响?
假设一个对象被初始化并且从未使用过,会发生什么?未使用的进口成本是多少?
这个问题可能需要一些编译器知识才能回答.我目前正在开发一个项目,我将创建一个可能是其中的数组
int[2][veryLargeNumber]
Run Code Online (Sandbox Code Playgroud)
要么
int [veryLargeNumber][2]
Run Code Online (Sandbox Code Playgroud)
它在逻辑上没有区别,但我认为内存中的形式(以及因此大小)可能不同(也许问题应该是,编译器是否足够聪明地重新排列数组以适应它们)?
我在我的程序上运行了一个堆转储.当我在内存分析器工具中打开它时,我发现java.lang.ref.Finalizerfor org.logicalcobwebs.proxool.ProxyStatement占用了大量内存.为什么会这样?

我想从一个集合中选择一个随机项目,但是选择任何项目的机会应该与相关的权重成比例
示例输入:
item weight
---- ------
sword of misery 10
shield of happy 5
potion of dying 6
triple-edged sword 1
Run Code Online (Sandbox Code Playgroud)
所以,如果我有4个可能的项目,那么获得任何一个没有权重的项目的机会将是1/4.
在这种情况下,用户获得痛苦之剑的可能性应该是三角剑的10倍.
如何在Java中进行加权随机选择?
在此页面甲骨文的Java HotSpot虚拟机的选项,它会列出-XX:+UseCompressedStrings作为默认选项和.但是在Java 6更新29中,默认情况下它处于关闭状态,并且在Java 7 update 2中它会报告警告
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option UseCompressedStrings; support was removed in 7.0
Run Code Online (Sandbox Code Playgroud)
有谁知道删除此选项背后的想法?
有了-mx2g这个例子,选项打开了4.541秒,在Java 6更新29中关闭了5.206秒.很难看出它会影响性能.
注意:Java 7更新2需要2.0 G,而没有压缩字符串的Java 6更新29需要1.8 GB,压缩字符串只需要1.0 GB.
在处理现实世界的货币价值时,我建议使用BigDecimal而不是Double.But我没有一个令人信服的解释,除了"通常是这样做".
你能否对这个问题嗤之以鼻?
编译器书(The Dragon book)解释了在堆栈上创建的值类型,并在堆上创建了引用类型.
对于Java,JVM还在运行时数据区域中包含堆和堆栈.在堆上创建对象和数组,方法帧被推送到堆栈.所有线程共享一个堆,而每个线程都有自己的堆栈.下图显示了这一点:

有关Java运行时数据区的更多信息.
我不明白的是,由于JVM本质上是一个软件,那些JVM堆,堆栈和线程如何映射到物理机器?
如果有人可以比较Java和C++之间的这些概念,我将不胜感激.因为Java在JVM上运行,但C++没有.
为了使这个问题更加准确,我想知道以下内容:
更新:我为进程的运行时物理内存绘制了一张图片.

为什么默认构造函数在父类中是必需的(显式),如果它有一个有争议的构造函数
class A {
A(int i){
}
}
class B extends A {
}
class Main {
public static void main(String a[]){
B b_obj = new B();
}
}
Run Code Online (Sandbox Code Playgroud)
这将是一个错误.