我一直在寻找Java中的双向映射实现,并偶然发现了这两个库:
两者都是免费的,具有我正在寻找的双向地图实现(Apache中的BidiMap,Google中的BiMap),几乎相同的大小(Apache 493 kB,Google 499 kB)[编辑:不再是真的!]并且似乎在各方面都和我很相似.
我应该选择哪一个,为什么?是否有其他等效替代方案(必须是免费的并至少具有双向映射)?我正在使用最新的Java SE,所以不需要人为地限制Java 5或类似的东西.
使用新的fork/join框架而不仅仅是在开始时将大任务分成N个子任务,将它们发送到缓存的线程池(来自Executors)并等待每个任务完成,有什么好处?我没有看到使用fork/join抽象如何简化问题或使解决方案从我们多年来的工作中提高效率.
例如,教程示例中的并行化模糊算法可以像这样实现:
public class Blur implements Runnable {
private int[] mSource;
private int mStart;
private int mLength;
private int[] mDestination;
private int mBlurWidth = 15; // Processing window size, should be odd.
public ForkBlur(int[] src, int start, int length, int[] dst) {
mSource = src;
mStart = start;
mLength = length;
mDestination = dst;
}
public void run() {
computeDirectly();
}
protected void computeDirectly() {
// As in the example, omitted for brevity
} …Run Code Online (Sandbox Code Playgroud) 是否有一种巧妙的方法从Locale 方法返回的"程序化名称" 中获取Locale实例toString()?一个明显而丑陋的解决方案是解析String然后根据它构建一个新的Locale实例,但也许有更好的方法/就绪解决方案呢?
需要的是我想在SQL数据库中存储一些特定于语言环境的设置,包括Locales本身,但是将序列化的Locale对象放在那里会很难看.我宁愿存储他们的字符串表示,这似乎相当充分.
有没有人有任何想法,为什么在AbstractList(以及在ArrayList中)中的removeRange方法是protected?它看起来像一个非常明确和有用的操作,但是,使用它,我们仍然被迫继承List实现.
有一些隐藏的理由吗?对我来说似乎很莫名.
我们有8位,16位,32位和64位硬件架构和操作系统.但不是说42位或69位.
为什么?它是否能使2 ^ n位成为更好的选择,或仅仅是与现有系统的兼容性?(64位寄存器可以容纳两个32位指针,或者一个32位数据单元可以容纳4个字节,这显然很方便.)
假设我有以下代码:
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(myRunnable);
Run Code Online (Sandbox Code Playgroud)
现在,如果myRunnable抛出一个RuntimeExcpetion,我怎么能抓住它?一种方法是提供我自己的ThreadFactory实现,newSingleThreadExecutor()并uncaughtExceptionHandler为其中的Threads 设置自定义.另一种方法是换myRunnable行Runnable包含try-catch -block 的本地(匿名).也许还有其他类似的解决方法.但是......不知怎的,这感觉很脏,我觉得不应该这么复杂.有清洁的解决方案吗?
有没有办法volatile在Java中声明数组元素?即
volatile int[] a = new int[10];
Run Code Online (Sandbox Code Playgroud)
声明数组引用 volatile,但数组元素(例如a[1])仍然不是volatile.所以我正在寻找类似的东西
volatile int[] a = new volatile int[10];
Run Code Online (Sandbox Code Playgroud)
但它不会那样工作.有可能吗?
为什么,为什么不java.util.concurrent提供其ExecutorServices 的队列长度指标?最近我发现自己做了这样的事情:
ExecutorService queue = Executors.newSingleThreadExecutor();
AtomicInteger queueLength = new AtomicInteger();
...
public void addTaskToQueue(Runnable runnable) {
if (queueLength.get() < MAX_QUEUE_LENGTH) {
queueLength.incrementAndGet(); // Increment queue when submitting task.
queue.submit(new Runnable() {
public void run() {
runnable.run();
queueLength.decrementAndGet(); // Decrement queue when task done.
}
});
} else {
// Trigger error: too long queue
}
}
Run Code Online (Sandbox Code Playgroud)
哪个工作正常,但......我认为这应该作为一部分实现ExecutorService.这是一个愚蠢的错误,容易携带一个与实际队列分开的计数器,计数器应该指示它的长度(让我想起C数组).但是,ExecutorServices是通过静态工厂方法获得的,因此无法简单地扩展优秀的单线程执行器并添加队列计数器.所以我该怎么做:
JNI教程,例如本教程,很好地介绍了如何访问对象中的原始字段,以及如何访问作为显式函数参数提供的数组(即作为子类jarray).但是如何访问作为字段内的字段的Java(原始)数组jobject?例如,我想操作以下Java对象的字节数组:
class JavaClass {
...
int i;
byte[] a;
}
Run Code Online (Sandbox Code Playgroud)
主程序可能是这样的:
class Test {
public static void main(String[] args) {
JavaClass jc = new JavaClass();
jc.a = new byte[100];
...
process(jc);
}
public static native void process(JavaClass jc);
}
Run Code Online (Sandbox Code Playgroud)
相应的C++方面将是:
JNIEXPORT void JNICALL Java_Test_process(JNIEnv * env, jclass c, jobject jc) {
jclass jcClass = env->GetObjectClass(jc);
jfieldID iId = env->GetFieldID(jcClass, "i", "I");
// This way we can get and set the "i" field. …Run Code Online (Sandbox Code Playgroud) 在Java图形或图表库上有一个早期的线程,其中发现JFreeChart非常好,但是,如其FAQ中所述,它不适用于实时渲染.
任何人都可以推荐一个支持实时渲染的类似库吗?只是一些基本的xy渲染 - 例如,从数据采集系统获取电压信号并在其到来时绘制它(x轴上的时间,y轴上的电压).