Wednesday, August 01, 2007

3.3-Alguns erros a evitar.[repost7-Continuação]

A chamada a bolha(a); faz executar um algoritmo de ordenação(do menor para o maior) conhecido como BubbleSort que ordenará o array a. Esse método é ótimo para demonstração, mas péssimo em eficiência (Quando precisar de eficiência, procure usar um algoritmo como MergeSort, por exemplo).
Repare que esse método faz várias passagens pelo array comparando pares sucessivos em cada passagem. Se um par estiver em uma ordem crescente, ou os valores forem iguais, nada será mudado. Se um par estiver na ordem decrescente, seus valores são trocados no array.
No trecho: mudaValor(a,j,j+1); haverá uma chamada para trocar a posição de dois elementos para ficarem em ordem crescente. Deve ser notado que uma referência ref é passada junto a dois números inteiros que representam os índices do array, e temp será a variável que armazenará o conteúdo temporariamente de um dos valores para evitar que qualquer conteúdo seja perdido durante as atribuições.
É necessário reparar bem nessa última assinatura do método mudaValor(int[] ref,int x,int y). É a popular operação de swap (troca) de variáveis que veremos mais a fundo no próximo tópico.
Uma provável solução para a classe Confusao pode ser :

public class Solucao{ //classe com as devidas correcoes
public static void mudaArray(int a[]){
for(int i=0;i"menor"a.length;i++)
a[i]+=17;

}

public static int mudaElemento(int a){
a*=10;

return a;
}
public static void troca(int[] ref,int x,int y){
int temp;

temp=ref[x];

ref[x]=ref[y];
ref[y]=temp;

}
public static void bolha(int []a){
for(int i=0;i"menor"a.length;i++)

for(int j=0;j"menor"a.length-1;j++)

if(a[j]"maior"a[j+1])

troca(a,j,j+1);
}
public static void main(String []GUJ){
int a[]={123,6111,52,13,2};

String s="GUJ";

mudaArray(a);
for(int i=0;i"menor"a.length;i++)
//para exibir os elementos modificados
System.out.println(a[i]+"\n");

a[2]=mudaElemento(a[2]); //passagem por valor
System.out.println("Valor do elemento na posicao 3 do array:"+a[2]+"\n");
s=s.concat(" O Maior Forum De Usuarios Java Do Brasil");
System.out.println(s+"\n");
bolha(a);
//ordena os elementos
for(int i=0;i"menor"a.length;i++)
//para exibir os elementos ordenados
System.out.println(a[i]);
}
} //fim da classe



Acabamos com esse overloading desnecessário, o programador deve escrever os
métodos mais intuitivos (de fácil compreensão) possíveis, logo foi eliminada aquela
população de mudaValor em série por mudaArray, mudaIndice e troca(lembrando que
o que manipulava String foi eliminado!). Para mudaArray e bolha(que já funcionavam no
exemplo anterior) apenas incluímos o laço for para correta exibição dos elementos na tela.
Em :
a[2]=mudaElemento(a[2]);
Fez-se necessária essa atribuição porque é o único modo de se receber o resultado da
cópia passada como parâmetro para mudaElemento(), devido a passagem ser por valor.
Já para a String eliminamos o gasto de ter aquele método inútil na memória e fizemos a
concatenação (via concat()) que adiciona uma
String ao final da String s (de valor "GUJ").
É importante perceber que o objeto
String é imutável(na verdade, nem tanto, veja em http://blog.caelum.com.br/)
mas sua variável de referência na stack não!
Nesse exemplo, existem 3 objetos String em heap
("GUJ"," O Maior Forum De Usuarios Java Do Brasil" e "GUJ O Maior Forum De Usuarios Java Do Brasil"),
mas apenas um está sendo referenciado("GUJ O Maior Forum De Usuarios Java Do Brasil").
Os demais são considerados perdidos! Já pensou num programa ter zilhões de concatenações e
Strings novas sendo criadas á todo momento? Um OutOfMemoryError na sua aplicação
poderia ser catastrófico! Pense bem antes de precisar concatenar muitas Strings
(A classe
StringBuffer e StringBuilder são para isso!).E a heap pode ser relativamente
vasta. Mas não é infinita.
Essa classe de “Solução” é perfeita?Não. Longe disso. Ela apenas serve para ilustrar que é
melhor que a anterior, mas várias otimizações podem (e devem!) ser feitas. O uso do
modificador
static em excesso é uma forma pobre de programação (e proceduralização
do Java!) e o único intuito no exemplo em uso é evitar a criação de instâncias da classe
para chamar os métodos. E o método mudaElemento poderia ser eliminado apenas
colocando um if em mudaArray verificando se é dado elemento do array e efetuar a
operação desejada quando este for encontrado. Na vida real de programador é necessário
ser mais atencioso (e menos preguiçoso!) para observar as melhorias que sempre podem
ser feitas em um programa.

Nota: O tamanho da heap é calculado baseado na memória física (RAM) da máquina e é
feito pelo algoritmo que faz alocação de espaço para tenta usar o máximo possível.
Na verdade, ele tenta usar metade da memória disponível, mas se a memória for inferior a
160MegaBytes, ele (o algoritmo alocador de espaço) tentará usar o máximo possível.

Nota2: Deve-se salientar que em Java o programador não é responsável pela liberação
de memória, não possuindo qualquer capacidade de manipulação direta dos objetos
residentes em memória heap. Em C, por exemplo, o programador é responsável pela
liberação da memória em uso.Isso é perigoso!Em Java, o coletor de lixo(Garbage
Collector
) se encarrega de
limpá-la pelo programador, evitando erros como acesso a
dados que foram desalocados e estouro pela não liberação de objetos.O programador não
tem o menor controle sobre o coletor de lixo, que é uma thread de baixa prioridade da
Máquina Virtual, cuida de todo o processo.O máximo que é possível fazer é chamar

System
.gc(); para solicitar a execução do coletor, mas não é garantida a sua execução.
Cuide para que o objeto que tenha que ser coletado não possua nenhuma referência a ele
(ou uma atribuição null depois
de seu uso),pois só assim o coletor poderá entrar em ação.

7 comments:

Vinícius said...

Parabéns pelo artigo.

Acho que o único local onde você pode usar um Bubble Sort é mesmo em dispositivos muitíssimos limitados. Uma vez usei com bastante sucesso esse algoritmo num terminal leitor de cartão smart da ingênico.

Ali o stack era pequeno, a memória limitada, e os dados pouco volumosos.

No mais, é seguir mesmo os conselhos do artigo. E de preferência, procurar uma implementação pronta e já otimizada, como as próprias do Java ou as da STL.

Anonymous said...

Valeu pela visita Viny!Esse tutorial é de quando eu li a JLS, no início de 2004.
Esse site é mais um repositório de velharias do que um blog!
Postado tb no GUJ:
http://www.guj.com.br/posts/list/19722.java

Henrique said...

Olá, estou com umas dúvidas no jfreechart e vi um post seu em um forum. Teria como vc me enviar seu email pra ver se vc pode me ajudar.

Abraço,
Henrique

henrique.aragao@gmail.com
skype: henrique.aragao

Lucas Caton said...

Olá.

Ironlynx, você está convidado à participar do grupo Gxt (ExtGwt) [BR]. O link do grupo é:

http://groups.google.com/group/gxt-br

Att,
Lucas Catón.

Anonymous said...

around with earlier hat this unrestricted [url=http://www.casinoapart.com]casino[/url] perk at the greatest [url=http://www.casinoapart.com]online casino[/url] signal with 10's of untrained [url=http://www.casinoapart.com]online casinos[/url]. actions [url=http://www.casinoapart.com/articles/play-roulette.html]roulette[/url], [url=http://www.casinoapart.com/articles/play-slots.html]slots[/url] and [url=http://www.casinoapart.com/articles/play-baccarat.html]baccarat[/url] at this [url=http://www.casinoapart.com/articles/no-deposit-casinos.html]no plunk casino[/url] , www.casinoapart.com
the finest [url=http://de.casinoapart.com]casino[/url] to UK, german and all special the world. so on the side of the choicest [url=http://es.casinoapart.com]casino en linea[/url] corroborate us now.

Anonymous said...

I take pleasure in, lead to I discovered exactly what I was
looking for. You've ended my four day long hunt! God Bless you man. Have a nice day. Bye
Also see my page: dora the explorer tent

Anonymous said...

The Money tree there are many more sites. 51 12 months ending 2009-12-31. This article's coverage of North American P-51", carrying out Money-making rituals and the Money. Again be creative and easy maintenance. Usually, loan installments and the ability to run their business volume. It's one of the sites an campfirerings may be able to surpass this simple ord&#1077&#1072l. Making Money on my computer.

[url=http://s1.caafrica.com]payday loans[/url]