2013-06-04 12 views
3

Описание проблемы: - Во время одной дискуссии я обнаружил, что программист застрял в точке, и я подумал, что должен поставить на форум.Имеет ли встроенные методы в Java, зависит от операционной системы?

Сегодня я искал преобразование массива в массив символов. И я проверил определение метода toCharArray() класса string.

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); 

Здесь мне не нужно понимать родной, но я должен знать. В таком нативном методе определите здесь то же самое, что и другой собственный метод определит для другой операционной системы.

ответ

2

Причина, по которой это происходит, потому что эта дорогостоящая функция может быть сильно оптимизирована с использованием собственного кода.

Но поведение одинаково независимо от ОС.

+0

@shivquery Вы видите, когда Java не располагала оптимизацией JIT (как раз вовремя) и JSM HotSpot, каждая строка байт-кода должна была интерпретироваться и затем выполняться. (программы по-прежнему можно запустить таким образом, если хотите). Поэтому, поскольку Java работает намного медленнее, чем собственный код, а так как 'System.arraycopy' был большим методом, они решили сделать его «родным». Теперь программы Java имеют близкие скорости, поэтому нет необходимости делать их родными. Однако, чтобы сделать определение метода тем же, они оставили его как «native». – gparyani

2

Поскольку основным преимуществом языка Java является переносимость через аппаратные платформы и операционные системы. Поэтому конкретный метод, хотя и объявлен как native, не должен изменять вашу подпись , например, имя или аргументы, чтобы следовать этому принципу.

Однако, что может быть сделано собственного метода. Эта реализация - для конкретной платформы. JNI предоставляет способ использования любых собственных методов в платформенно-независимом способе.

2

Большинство операций независимо от ОС, где это возможно.

Есть некоторые очевидные исключения, например. Runtime.exec (команда String) полностью зависит от того, какие команды вы установили.

Это создаст только имена файлов, разрешенные ОС. В Linux вы можете использовать символы, которые недействительны в Windows. Кроме того, Windows нечувствительна к регистру, что означает, что если у вас есть другой файл, который будет иметь то же имя, игнорируя регистр, он перезапишет Windows, но создаст новый файл в Linux.

new FileOutputStream(String filename) 

Обычный Гоча является то, что Linux позволяет удалить файлы, которые не были закрыты, но окна не будут. Это может привести к разному поведению на разных платформах.

Смежные вопросы