问题描述: - 在一次讨论中,我发现程序员陷入困境,我认为我应该加入论坛。
今天我在搜索数组转换为char数组。我检查了字符串类的 toCharArray()方法的定义。
char str[] = "native".toCharArray();
toCharArray()定义: -
public char[] toCharArray() {
char result[] = new char[count];
getChars(0, count, result, 0);
return result;
}
getChars定义: -
public void getChars(int srcBegin,int srcEnd,char dst[],int dstBegin){
if(srcBegin<0){
throw new StringIndexOutOfBoundsException(srcBegin);
}
if(srcEnd>count){
throw new StringIndexOutOfBoundsException(srcEnd);
}
if(srcBegin>srcEnd){
throw new StringIndexOutOfBoundsException(srcEnd-srcBegin);
}
System.arraycopy(value,offset+srcBegin,dst,dstBegin,srcEnd-srcBegin);
}
然后是原生方法: -
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
这里我不需要了解本机,但我必须知道在这样的本机方法中,以相同的方式定义不同的本机方法将为其他操作系统定义。
答案 0 :(得分:2)
它原生的原因是因为使用本机代码可以大大优化这种昂贵的功能。
但无论操作系统如何,行为都是一样的。
答案 1 :(得分:2)
由于Java语言的主要优点是跨硬件平台和操作系统的可移植性。因此,特定方法虽然被声明为本机,但不应更改签名,例如名称或参数,以遵循此原则。
然而,可以改变的是本机方法的实现。此实现是特定于平台的。 JNI提供了一种以独立于平台的方式使用任何本机方法的方法。
答案 2 :(得分:2)
大多数操作都是独立于操作系统的,尽可能。
有一些明显的例外,例如Runtime.exec(String命令)将完全取决于您安装的命令。
这只会创建操作系统允许的文件名。在Linux上,您可以使用在Windows中无效的字符。 Windows也不区分大小写,这意味着如果您有另一个具有相同名称的文件,忽略大小写,它将在Windows上覆盖,但在Linux中创建一个新文件。
new FileOutputStream(String filename)
常见的问题是,Linux允许您删除尚未关闭的文件,但Windows不会删除。这可能会导致不同平台上的不同行为。