| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/09/2008 10:04:46
|
arthurgon
Java Ninja
![[Avatar]](/images/avatar/981ec2327e01401e552164ed7314d4b0.jpeg)
Membro desde: 05/02/2007 00:57:43
Mensagens: 284
Localização: são paulo
Offline
|
Olá gente;
Alguém saberia me responder uma real necessidade ou vantagem em se utilizar Vector ao invés de List em uma aplicação?
Estou realizando manutenção em um sistema Web muito antigo. A performance dele é muito lenta...
Vlw gente...
|
Arthur G. Gomes Jr.
Analista Java Sênior |
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/09/2008 10:10:03
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
O único caso é onde você precisa acessar simultaneamente um Vector por duas threads diferentes, e você não quer pôr um "synchronized" sobre a variável do tipo "Vector". Mas esse caso é bastante raro em aplicações Web.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/09/2008 11:04:40
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
arthurgon wrote:Olá gente;
Alguém saberia me responder uma real necessidade ou vantagem em se utilizar Vector ao invés de List em uma aplicação?
Estou realizando manutenção em um sistema Web muito antigo. A performance dele é muito lenta...
Vlw gente...
Se o sistema é muito antigo é provável que não existisse a interface List para ele ( que só foi incluida no java 2 se não engano).
Se puder faça um refactoring de todos os retornos e declarações para List e todas as inicilaizações para Vector.
Depois descubra se ha alguma concorrência em cima dessa lista. Se não, use ArrayList.
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/09/2008 12:22:44
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
arthurgon wrote:A performance dele é muito lenta...
Problemas de desempenho normalmente são:
- Por problemas na indexação do banco de dados;
- Por queries SQL mal-construídas;
- Por utilização excessiva de memória da sessão;
- Pelo uso indevido do operador "+=" com Strings para montar uma página;
- Pelo uso de algoritmos inadequados (busca linear, ordenação com bubblesort etc.)
É um pouco difícil que trocar Vector por ArrayList vá ajudar alguma coisa. Se for usado o Java 5.0 ou superior, então devido a alguns aperfeiçoamentos no tratamento de locks, nem faria muita diferença em máquinas multiprocessadas. (Em máquina com apenas 1 processador, não faz praticamente nenhuma diferença o uso de Vector ou ArrayList).
|
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 22/09/2008 13:11:49
|
Link_pg
JavaEvangelist
![[Avatar]](/images/avatar/4cea2358d3cc5f8cd32397ca9bc51b94.jpg)
Membro desde: 28/04/2006 00:17:38
Mensagens: 413
Localização: Praia Grande / São Paulo - SP
Offline
|
Olá!
Os métodos de Vector podem ser sincronizados, mas para operações que utilizem mais de um método (por exemplo remover de uma posição e colocar em outra) não vai adiantar muita coisa...
Abraços
|
Eduardo Felipe Vieira
Blog de Tecnologia!
Outro blog meu legal também mas não é de TI.
"Nós poderíamos ser muito melhores se não quiséssemos ser tão bons." |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/09/2008 07:33:54
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
thingol wrote:
É um pouco difícil que trocar Vector por ArrayList vá ajudar alguma coisa. Se for usado o Java 5.0 ou superior, então devido a alguns aperfeiçoamentos no tratamento de locks, nem faria muita diferença em máquinas multiprocessadas. (Em máquina com apenas 1 processador, não faz praticamente nenhuma diferença o uso de Vector ou ArrayList).
Posso inferir dai que vc cria todos os seus programas usando Vector como implementação para List ?
Não ? Então é porque existe alguma diferença 'prática" ... certo ?
Vendo por ai porque usar StringBuilder se StringBuffer faz a mesma coisa de forma thread-safe e "Em máquina com apenas 1 processador, não faz praticamente nenhuma diferença"
(não é o numero de processadores que importa, é o numero de threads concorrentes no objeto. não ?)
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/09/2008 08:33:22
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Uma coisa que mata não é o uso de Vector ou ArrayList. É que as pessoas não sabem que existem outras estruturas de dados como Set ou Map; e quando vão fazer buscas elas sempre usam busca linear sobre um Vector ou ArrayList. Pior de tudo, já vi muita gente boa que, para fazer uma busca linear, em vez de abandonar o "for" quando encontram o dado, acabam continuando a percorrer a lista :( Em seu blog, o Cliff Click (da Azul Systems) comenta o caso em que ele teve de efetuar uma análise de desempenho (do tipo "eu comprei uma máquina com 1024 processadores Java e o programa roda muito lentamente, a culpa é de quem?"). Obviamente ele teve de: - Descompilar o programa do cliente, que tinha uma busca linear desse tipo (o cliente não se dignou nem a fornecer o código-fonte...) - Recompilar o programa usando uma estrutura de dados mais decente; - Medir os resultados, que foram estupidamente mais rápidos.
This message was edited 1 time. Last update was at 24/09/2008 08:35:39
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/09/2008 09:45:21
|
claudneto
JavaEvangelist
![[Avatar]](/images/avatar/fe11fd4030d827a13e7e5593851e0040.png)
Membro desde: 12/08/2008 15:09:47
Mensagens: 489
Localização: Mogi das Cruzes
Offline
|
Um dia na faculdade, meu professor me mostrou um outro método de busca...
Não é busca sequencial...é um outro que eu não me recordo...
Disse ele que o programa fica com um rendimento de 80% melhor que busca sequencial...
Não me recordo como é...mas eu sei que vc ordena o vetor ou a lista e vai dividindo por 2...
Se uma pessoa escolher um numero de 0 a 1000, em 10 perguntas, no pior caso, ele descobre qual é o numero.
Em busca sequencial, ele faria, no pior caso, 1000 perguntas.
Uma boa diferença!
|
UsuarioGUJ us = new UsuarioGUJ();
if (us.visitar(Use a porra do Google)) {
us.sendString("Eu não mando mensagens sem pesquisar!");
else {
us.sendString("Eu mando mensagens sem pesquisar!");
} |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/09/2008 10:14:38
|
avencurt
Thread.start()
Membro desde: 10/09/2008 15:03:43
Mensagens: 27
Offline
|
Essa busca dividida por 2 chama-se busca binária
|
http://www.avencurt.com
http://www.flickr.com/photos/avencurt |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/09/2008 12:06:06
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
thingol wrote:Uma coisa que mata não é o uso de Vector ou ArrayList.
É que as pessoas não sabem que existem outras estruturas de dados como Set ou Map; e quando vão fazer buscas elas sempre usam busca linear sobre um Vector ou ArrayList.
A tá, ok, mas o problema não era a busca e sim usar uma ou outra implementação. É claro que poderíamos usar LinkedList ou o CopyOnWriteArrayList mas o ponto era substituir Vector sem alterar a interface. Para usar um Set ou Map teriamos que alterar
o sistema ainda mais profundamente porque as interfaces são diferentes. (se bem que é verdade que a grande maioria de returns pode ser mudado para Collection).
O que me estranhou foi vc dizer que não ha nenhum efeito em trocar um pelo outro.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/09/2008 12:07:45
|
claudneto
JavaEvangelist
![[Avatar]](/images/avatar/fe11fd4030d827a13e7e5593851e0040.png)
Membro desde: 12/08/2008 15:09:47
Mensagens: 489
Localização: Mogi das Cruzes
Offline
|
avencurt wrote:Essa busca dividida por 2 chama-se busca binária 
Boaaaaaa...
É verdadeeee...
Hahaha...que idiota que eu sou! Dividindo por 2 só poderia ser binária!
aUIhAIUahiuaHiuaHuiahaiuaIUhA
Me rebaixei a Smalltalk depois dessa!
|
UsuarioGUJ us = new UsuarioGUJ();
if (us.visitar(Use a porra do Google)) {
us.sendString("Eu não mando mensagens sem pesquisar!");
else {
us.sendString("Eu mando mensagens sem pesquisar!");
} |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/09/2008 12:37:00
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
A busca binária (onde se supõe que os elementos estejam ordenados) tem tempo de execução proporcional ao logaritmo de N, onde N é o número de elementos. Mas se os elementos estiverem em uma "hash table" (tabela de índice calculado), esse tempo de execução é praticamente fixo.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/09/2008 12:41:29
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17543
Offline
|
Para usar um Set ou Map teriamos que alterar
o sistema ainda mais profundamente porque as interfaces são diferentes.
Hum... pela minha experiência, normalmente problemas de desempenho nunca são tão fáceis de resolver que você simplesmente troque a implementação sem mudar a interface. Há certas coisas que precisam de cirurgias mais radicais.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 24/09/2008 12:43:17
|
victorwss
JWizard
![[Avatar]](/images/avatar/4ab232445f9b21b65dfdf6ea5f27f704.png)
Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline
|
Vector ou ArrayList?
Vector é uma das piores e mais horrorosas classes que já foram inventadas no java. Faça-se o favor de esquecer que ela existe e abominá-la e odiá-la bem como a todos que insistem em utilizá-la, para que ela possa ser atirada no enxofre das profundezas do submundo e perecer por toda a eternidade no castigo que essa infortúnia classe merece.
Eliminando Vector, chegamos ao ponto onde pensa-se que ArrayList é a solução para tudo, algo que é uma grande mentira. O correto é usar List ("CODE TO AN INTERFACE"). Você só usa ArrayList se:
Você está instanciando a lista AND (você precisa acessar a lista em posições não lineares OR você já sabe o tamanho máximo que a lista vai ter quando a criar) AND (você não vai inserir e nem excluir elementos em uma posição que não seja a última OR a lista é pequena).
Considere também usar LinkedList se:
Você está instanciando a lista AND (você SEMPRE vai percorrer a lista linearmente OR você vai percorre-la de trás-para-frente) AND (se você quiser, você vai inserir ou excluir elementos no meio ou no começo da lista).
Se você não estiver instanciando nada, use apenas List (repetindo: code to an interface!)
Vale lembrar que ArrayList e LinkedList não são thread-safe. Se você precisa de segurança a threads, considere usar o seguinte método:
Assim, segurança em threads não é desculpa para usar Vector no lugar de ArrayList. E se você tem requisitos de concorrência bem peculiares, as implementações de List no pacote java.util.concurrent também podem te ajudar.
E se você não ficar satisfeito com nenhuma destas implementações, porque não criar a sua própria classe que implemente java.util.List?
Por fim, nem tudo são Lists. Pesquise java.util.Map, java.util.Set, java.util.Collection, java.util.Iterator e java.lang.Iterable bem como as suas diferentes implementações.
This message was edited 2 times. Last update was at 24/09/2008 13:26:02
|
Victor Williams Stafusa da Silva
Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.
Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.
Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.
É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).
Se você escreve "concerteza", "concerteza" você andou matando aulas de português. |
|
|
 |
|
|