我正在实现一个接口,其功能类似于可以包含对象类型的表.接口指定以下功能:
double[] getDoubles(int columnIndex);
Run Code Online (Sandbox Code Playgroud)
我感到难过的是,在我的实现中,我将表数据存储在2D Object
数组(Object[][] data
)中.当我需要返回值时,我想要执行以下操作(假设getDoubles()
只会在包含双精度的列上调用,因此将不会ClassCastExceptions
):
double[] getDoubles(int columnIndex) {
return (double[]) data[columnIndex];
}
Run Code Online (Sandbox Code Playgroud)
但是 - Java不允许Object[]
强制转换为double[]
.将它转换Double[]
为正常是因为它Double
是一个对象而不是一个原语,但我的接口指定数据将作为一个返回double[]
.
所以我有两个问题:
Object[][]
表中获取列数据并返回原语数组吗?Double[]
,是否会对性能产生影响?我正在开发一个需要与C应用程序通信的Java应用程序.C应用程序使用共享内存和mmap进行通信,我需要Java应用程序才能访问相同的内存.
我的第一次尝试涉及使用JNI调用从共享内存中检索数据,但每次JNI调用的开销都会导致性能下降,因此我想要一种方法来获取Java中的内存并在Java端进行数据检索.
我的想法是我需要做以下事情:
这是最好的方法吗?另外,我不确定如何实际创建FileChannel以指向正确的内存位置.
几个同事和我正在讨论当从C++方法返回局部变量(在堆栈上分配)时会发生什么.
以下代码适用于单元测试,但我认为这只是因为单元测试很幸运,并且不会尝试重用obj使用的堆栈上的内存.
这有用吗?
static MyObject createMyObject() {
MyObject obj;
return obj;
}
Run Code Online (Sandbox Code Playgroud) 我有一个编译为32位的共享库.我可以在64位应用程序中使用它,还是需要将共享库编译为64位?
我有几个使用相同JNI库的类,称为"jni".在每个类中,我在类的静态初始化程序中调用了System.loadLibrary():
Class class1 {
static{
System.loadLibrary("jni");
}
...
}
Class class2 {
static{
System.loadLibrary("jni");
}
...
}
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,我只想调用System.loadLibrary()一次,因为它可能需要一段时间.是否有一种简单而干净的方法来防止同一个库的多次加载?
我正在使用Java URL和URLConnection类使用FTP将文件上传到服务器.我不需要做任何事情,只需上传文件,所以我想避免任何外部库,我担心使用不支持的sun.net.ftp类.
有没有办法在FTP连接字符串中使用绝对路径?我想把我的文件放在"/ ftptransfers/..."之类的东西,但FTP路径是相对于用户主目录的.
示例上传代码:
URL url = new URL("ftp://username:password@host/file.txt");
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
OutputStream out = uc.getOutputStream() ;
out.write("THIS DATA WILL BE WRITTEN TO FILE".getBytes());
out.close();
Run Code Online (Sandbox Code Playgroud) Java静态变量是否在同一Web应用程序的实例之间共享?
class MyClass
{
private static SomeClass myStaticObject = new SomeClass();
}
Run Code Online (Sandbox Code Playgroud)
如果Web应用程序使用MyClass并且该应用程序的多个实例在Web服务器上运行,那么myStaticObject是否已多次初始化?
我有以下数据结构:
struct fastEngine { ... }
struct slowEngine { ... }
template<typename T>
class Car {
T engine;
vector<T> backupEngines;
virtual void drive() = 0;
}
class FastCar : public Car<fastEngine> {
virtual void drive() {
// use the values of "engine" in some way
}
}
class SlowCar : public Car<slowEngine> {
virtual void drive() {
// use the values of "engine" in some way
}
}
Car* getCarFromCarFactory() { // 1
if (randomNumber == 0)
return new FastCar(); …
Run Code Online (Sandbox Code Playgroud) 当我尝试通过键盘或鼠标使JSpinner不可编辑时,如下所示:
((DefaultEditor) mySpinner.getEditor()).getTextField().setEditable(false);
mySpinner.setEnabled(false);
Run Code Online (Sandbox Code Playgroud)
它禁用任何键盘输入和粘贴,但我仍然可以单击向上/向下按钮并更改值.
如何禁用向上/向下按钮?
我有一个 C++ 应用程序和一个 Java 应用程序,它们需要以相同的方式记录消息。我的 Java 应用程序使用由 Log4j 配置支持的 Apache Commons Logging。我需要一个 log4j 配置,以便我可以在一个位置更改我的日志记录首选项。在我的 C++ 应用程序中,我捕获了对 printf() 和 fprintf(std***) 的所有调用,并且我认为我有以下选项:
在我的 C++ 应用程序中 fork,从 (f)printf() 调用到新进程 stdin 创建一个管道,并启动一个 Java 程序,该程序从 stdin 读取并使用 Commons Logging 记录
使用 JNI 的 JNI_CreateJVM() 在 C++ 应用程序中创建一个 JVM,并在进行 (f)printf() 调用时调用 Java 日志记录方法
使用 Log4cxx 之类的东西来读取与 Java 应用程序相同的配置并在 C++ 中本地登录
我想尽可能避免选项 3,因为我不想向我的应用程序添加另一个第三方依赖项。我知道从 C++ 过渡到 Java 会产生性能成本,但我不确定它是否会那么重要。