classe de coleção para navegação  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
lordExorcist
JavaBaby
[Avatar]

Membro desde: 02/05/2004 01:18:30
Mensagens: 89
Localização: Natal, RN
Offline

Bem, estou desenvolvendo um navegador (GUI) com os botões de "primeiro", "próximo", "anterior" e "último".
Qual classe (se existir) da API que possui os métodos necessários para navegação (tipo "first()", "next()", "previous()" e "last()")?
[MSN]
Filipe Sabella
GUJ Expert

Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline

http://java.sun.com/j2se/1.4.2/docs/api/java/util/LinkedList.html

Se for iterar pela lista, faça um favor para sua ram utilizando Iterators, e não um for .. size().

Former LIPE.
[ICQ]
keller
GUJ Master
[Avatar]

Membro desde: 12/11/2003 16:24:00
Mensagens: 1817
Localização: Auckland - NZ
Offline

LIPE wrote:
Se for iterar pela lista, faça um favor para sua ram utilizando Iterators, e não um for .. size().


Há algum artigo que me prove isso?

*não estou duvidando, apenas por aprendizado.
**eu uso for .size()

valeu! até mais..

Guilherme I. Keller (Gui)
Diploma in Web Development and Desktop Publishing
SCJA | SCJP | SCWCD | SCBCD | CSM
"Test it, before it test you."
http://flickr.com/guikeller
[WWW] [MSN]
Filipe Sabella
GUJ Expert

Membro desde: 12/03/2003 11:25:57
Mensagens: 4680
Offline

Bem, aprendi a razão disso na palestra do Guilherme Silveira

Basicamente cada List provê uma implementação diferente sobre a maneira em que os objetos são guardados.

Por exemplo o ArrayList guarda os objetos dentro de um array comum de objetos. Portanto é muito simples fazer um list.get( 13 ), pois internamente ela fará return array[ 13 ]. Mas se fosse necessário inserir um objeto na posição 0 do array, internamente seria necessário realocar todas as instâncias para numa nova posição.

No caso da LinkedList, a implementação é diferente, fazendo com que seja muito simples inserir um objeto no topo ou no fim, porém, para pegar um objeto numa posição específica é bem mais lento.

Por esse motivo que todas as Collections implementam Iterator. Ao pedir este objeto para a coleção, ela retornara um objeto que sabe a melhor maneira possível para iterar sobre todos os objetos nela contidos.
Para o usuário do Iterator, tanto faz como ele funciona internamente, mas utilizá-lo ao inver do for .. size() pode ser crítico ao mudar a implementação da Collection.

Um exemplo:

Esse processo ocorreria com uma certa tranquilidade. Mas caso o método test fizesse isto:


Seu pc iria explodir

Você pode baixar os arquivos da palestra (cujos exemplos acima be baseei completamente) aqui:
http://www.guj.com.br/posts/list/20765.java

Former LIPE.
[ICQ]
Fabricio Cozer Martins
GUJ Ranger
[Avatar]

Membro desde: 08/05/2004 10:22:03
Mensagens: 935
Localização: Salvador/Brasil
Offline

unnhh ... massa mesmo essas dicas!!!!..
estava estudando justamente isso aqui hoje ...
Na verdade o LinkedList utiliza o algoritmo de ListaDuplamenteEncadeada,
e só vai ser util caso vc precise acessar , incluir , remover , elementos das pontas , inicio e fim da lista ...

Vou dar uma olhada nesse material da palestra!!!

valeu mesmo cara pela dica... estava procurando um material desse...
isso que faz a diferenca em grandes aplicacoes !!! rsrsrs!!!
Essa galera do GUJ bota pra la!!!!!

rodei ate aqui um exemplo..




Saida:
---------------
tempo do ArrayList: 7.11 s
tempo do LinkedList: 0.21 s


Fabrício Cozer Martins
Analista de Sistemas
Bacharel em Ciência da Computação da UFBa
Sun Certified Programmer for Java 2 Platform 1.4
Sun Certified Web Component Developer for J2EE 1.4
[MSN] [ICQ]
fcmartins
Java Ninja
[Avatar]

Membro desde: 12/01/2005 09:40:43
Mensagens: 293
Localização: Bragança Paulista- SP
Offline

Eu andei lendo uns artigos no OnJava sobre coleções e os testes feitos mostram que em muito poucos casos a LinkedList é melhor que um ArrayList, inclusive nos casos em a melhora seria esperada. Na dúvida acabei rodando uns testes por conta própria (na 1.4, preciso refazer na 1.5) e confirmei que o desempenho da LinkedList é mesmo inferior ao do ArrayList e mesmo quando é superior a diferença não é significativa.

This message was edited 2 times. Last update was at 03/03/2005 02:28:33


Almanaque

{SCJP 1.4}
{SCWCD 1.4}
Fabricio Cozer Martins
GUJ Ranger
[Avatar]

Membro desde: 08/05/2004 10:22:03
Mensagens: 935
Localização: Salvador/Brasil
Offline

ahh .. de uma pesquisada sobre ListIterator ... vc pode navegar pra frente e pra tras...

Fabrício Cozer Martins
Analista de Sistemas
Bacharel em Ciência da Computação da UFBa
Sun Certified Programmer for Java 2 Platform 1.4
Sun Certified Web Component Developer for J2EE 1.4
[MSN] [ICQ]
Guilherme Silveira
Administrador

Membro desde: 14/08/2002 10:09:26
Mensagens: 1096
Localização: Sao Paulo
Offline

fcmartins wrote:Eu andei lendo uns artigos no OnJava sobre coleções e os testes feitos mostram que em muito poucos casos a LinkedList é melhor que um ArrayList, inclusive nos casos em a melhora seria esperada. Na dúvida acabei rodando uns testes por conta própria (na 1.4, preciso refazer na 1.5) e confirmei que o desempenho da LinkedList é mesmo inferior ao do ArrayList e mesmo quando é superior a diferença não é significativa.



ArrayList e LinkedList nao sao iguais. Possuem tempos diferentes e algoritmos diferentes.

Exemplo:

Tente adicionar 50000 objetos na posicao zero de uma arraylist. Cronometre o tempo
Faca o mesmo com linkedlist.
Resultado: linked list ganha


Tente fazer um for(int i=0;i<10000;i++) e chamar get(i) em uma linkedlist
Faca o mesmo para uma arraylist
Resultado: array list ganha

Resultado final:
Dependendo do que voce vai fazer a escolha de ArrayList ou LinkedList faz o seu programa funcionar o nao. Como o proprio Lipe comentou, voces podem encontrar o ppt da apresentacao com exemplos muito legais e explicacoes teorias: nao se iludam, a escolha do algoritmo nao eh facil e FAZ TODA A DIFERENCA

Fcmartis, se voce se preocupa com pilha, fila etc, a discussao de arraylist cai como uma luva pois eh quando linkedlist pode ser MILHOES de vezes mais rapido (sem exagero).

Att

Guilherme

-------------------------------------------------------
Guilherme Silveirahttp://blog.caelum.com.br
[Email] [WWW] [MSN]
Guilherme Silveira
Administrador

Membro desde: 14/08/2002 10:09:26
Mensagens: 1096
Localização: Sao Paulo
Offline

gui wrote:
LIPE wrote:
Se for iterar pela lista, faça um favor para sua ram utilizando Iterators, e não um for .. size().


Há algum artigo que me prove isso?

*não estou duvidando, apenas por aprendizado.
**eu uso for .size()

valeu! até mais..


Qualquer livro que ensine lista ligada e arrays, ou curso de analise de algoritmos em faculdade mostra que o tempo esperado de iteracao em:
lista ligada: O(N*N)
arraylist: O(N)

Tem o site do www.ime.usp.br/~pf com informacoes na area

Att

Guilherme Silveira

-------------------------------------------------------
Guilherme Silveirahttp://blog.caelum.com.br
[Email] [WWW] [MSN]
mister__m
Virtual Machine Man
[Avatar]

Membro desde: 18/03/2005 16:13:17
Mensagens: 736
Offline

Nota importante a todos: se você tem um método que roda esporadicamente, fora de um loop, em que você precisa criar uma List e adicionar um punhado de itens, use a primeira implementação que vier à sua cabeça

Parece brincadeira, mas não é. Não vai fazer como o povo que cria String com StringBuffer (e agora StringBuilder) pra concatenar duas Strings. Legibilidade sempre que possível.

Tudo isso que foi comentado aqui é realmente importante para quando você precisar de performance. Nos outros casos, seja consistente e use sempre a mesma forma de fazer as coisas, até para que alguém no futuro não pare para ler seu código e ache que tem algo relevante naquele método porque usa LinkedList ao invés de ArrayList...

Michael Nascimento Santos, aka Mister M

Summa Technologies do Brasil - http://www.summa-tech.com/
genesis: Uma nova forma de desenvolver aplicações - https://genesis.dev.java.net/
ThinNB: Suporte a Thinlet no NetBeans - https://thinnb.dev.java.net/
Líder da JSR-310 - Date and Time API
Expert Group Member das JSRs 207 (PD4J), 250 (Common Annotations), 270 (Java 2 SE 6.0), 296 (Swing Framework) e 303 (Bean Validation)
SouJava: Fortalecendo a comunidade Java brasileira - https://soujava.dev.java.net/ https://www.soujava.org.br/
JSR Community @ java.net - http://community.java.net/jsr
Blogs - http://blog.michaelnascimento.com.br/ http://today.java.net/pub/au/80
Twitter - @mr__m
[WWW]
Guilherme Silveira
Administrador

Membro desde: 14/08/2002 10:09:26
Mensagens: 1096
Localização: Sao Paulo
Offline

boa Michael,

tentando concatenar com a sua ideia:
Se voce por algum motivo precisa escolher uma implementacao nao comum (como o caso de algoritmos especificos) por causa de performance em um caso especifico, COMENTE ou DOCUMENTE porque voce fez tal escolha....

Abraco

Guilherme

ps: tambem odeio o caso do stringbuffer em metodo bobo

-------------------------------------------------------
Guilherme Silveirahttp://blog.caelum.com.br
[Email] [WWW] [MSN]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team