Implementação de classe do sistema Java

8

A Systemclasse Java contém vários membros de dados e métodos que fazem todo o sentido estar lá. Por exemplo:

System.in (variable)
System.err (variable)
System.out (variable)
System.exit(int)
System.gc()
System.getSecurityManager()

No entanto, há um método que não entendo estar lá:

System.arraycopy(Object, int, Object, int int)

Copiar uma matriz para outra parece-me pertencer à Arraysclasse; da documentação:

Essa classe contém vários métodos para manipular matrizes (como classificação e pesquisa). Essa classe também contém uma fábrica estática que permite que as matrizes sejam exibidas como listas.

Métodos para manipular matrizes é o que me leva a essa conclusão, pois copiar uma matriz para outra certamente é manipulação de matriz , certo?

Então, minha pergunta: por que é arraycopy()em System?

É uma relíquia de uma Systemimplementação inicial da classe Java ? O método não está marcado como obsoleto, então estou um pouco perdido. Além disso, ele não segue o padrão Java camelCase, o que me leva a pensar que é uma relíquia do design inicial da biblioteca.

Chris Cirefice
fonte
Provavelmente porque costumava não haver um bom lugar para colocá-lo, e agora é tarde demais para movê-lo.
user253751

Respostas:

8

System.arraycopyé implementado nativamente por cada JVM. Aqui está a declaração do método:

public static native void arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);

Isso significa que ele faz a cópia da matriz da maneira mais rápida possível nas instruções de montagem nativas. A idéia é que essa seja uma funcionalidade potencialmente lenta e potencialmente lenta que o Java deve fornecer esse comportamento em um nível baixo.

Outras maneiras de copiar matrizes envolvem System.arraycopyou usam loops interpretados, o que não seria tão eficiente.

durron597
fonte
Ok, isso faz um pouco de sentido agora; Eu não sabia que cada JVM tinha sua própria implementação disso. Dito isto, estão todos os native métodos System? Ao nomear convenções, meio que faz sentido, porque elas dependem do sistema , mas do ponto de vista organizacional, arraycopyfaria sentido ser definido na Arrayclasse ou algo semelhante e ter sua implementação nativa lá. Pessoalmente, usei arraycopyapenas uma vez em meus 5 anos de programação.
22815 Chris Cirefice
5
Ainda está lá por motivos de compatibilidade com versões anteriores. Além disso, embora nem todos os nativemétodos estejam inseridos System, não há nativemétodos java.util.Arrays.
durron597
Entendo, bem, isso esclarece as perguntas que eu tinha, obrigado!
22815 Chris Cirefice
4

É uma relíquia de uma implementação inicial da classe Java System?

O System.arraycopy é uma das partes mais antigas da biblioteca, enquanto o java.util.Arrays foi adicionado no 1.2. Eu não chamaria de arraycopy uma relíquia, pois não há nada que a substitua diretamente, e os vários métodos de cópia em Arrays são implementados em termos disso.

Não há nada de especial no sistema ou nas matrizes que exijam que os métodos nativos estejam em um ou os impeçam de estar no outro.

Gatkin
fonte