Por que o Java Vector é considerado uma classe herdada, obsoleta ou obsoleta?
Seu uso não é válido ao trabalhar com simultaneidade?
E se eu não quiser sincronizar objetos manualmente e apenas desejar usar uma coleção segura para threads sem precisar fazer novas cópias da matriz subjacente (como CopyOnWriteArrayList
faz), então é bom usar Vector
?
Que tal Stack
, que é uma subclasse Vector
, o que devo usar em vez disso?
Respostas:
Vector
sincroniza em cada operação individual. Isso quase nunca é o que você quer fazer.Geralmente você deseja sincronizar toda uma sequência de operações. A sincronização de operações individuais é menos segura (se você iterar sobre uma
Vector
, por exemplo, ainda precisará bloquear um bloqueio para evitar que outras pessoas alterem a coleção ao mesmo tempo, o que causaria umConcurrentModificationException
no encadeamento de iteração), mas também mais lento ( por que fechar repetidamente uma fechadura quando uma vez será suficiente)?Obviamente, ele também tem a sobrecarga de travamento, mesmo quando você não precisa.
Basicamente, é uma abordagem muito falha para sincronização na maioria das situações. Como o Sr. Brian Henk apontou, você pode decorar uma coleção usando as chamadas como
Collections.synchronizedList
- o fato deVector
combinar a implementação da coleção "array redimensionada" com o bit "sincronizar todas as operações" é outro exemplo de design inadequado; a abordagem de decoração oferece uma separação mais limpa das preocupações.Quanto a um
Stack
equivalente - eu iria olhar paraDeque
/ArrayDeque
para começar.fonte
O vetor fazia parte do 1.0 - a implementação original tinha duas desvantagens:
1. Nomeação: os vetores são realmente apenas listas que podem ser acessadas como matrizes, portanto deveriam ter sido chamadas
ArrayList
(que é a substituição do Java 1.2 CollectionsVector
).2. Concorrência: Toda a
get()
,set()
métodos sãosynchronized
, então você não pode ter grão fino controle sobre sincronização.Não há muita diferença entre
ArrayList
eVector
, mas você deve usarArrayList
.No documento da API.
fonte
ArrayList
,LinkedList
etc., todos os quais implementar a interfaceList
, por isso, se você quiser utilizar osList
métodos sem ter que saber o que a implementação subjacente na verdade é que você pode apenas tomar umList
como um parâmetro para métodos, etc. O mesmo se aplica para os implementadores deMap
e assim por diante. Enquanto isso, o C ++ possui umastd::array
classe, que é apenas uma substituição baseada em modelo para matrizes de comprimento estático no estilo C.Além das respostas já declaradas sobre o uso do Vector, o Vector também possui vários métodos de enumeração e recuperação de elementos diferentes da interface da Lista, e os desenvolvedores (especialmente aqueles que aprenderam Java antes da 1.2) podem tender a usá-los se estiverem no diretório código. Embora as enumerações sejam mais rápidas, elas não verificam se a coleção foi modificada durante a iteração, o que pode causar problemas, e como o Vector pode ser escolhido para sua sincronização - com o acesso do atendente de vários encadeamentos, isso o torna um problema particularmente pernicioso. O uso desses métodos também associa muito código ao Vector, de forma que não será fácil substituí-lo por uma implementação de Lista diferente.
fonte
Você pode usar o método synchronizedCollection / List
java.util.Collection
para obter uma coleção segura para threads de uma coleção não segura para threads.fonte
java.util.Stack
herda a sobrecarga de sincronização dejava.util.Vector
, que geralmente não é justificada.Herda muito mais do que isso, no entanto. O fato de
java.util.Stack extends java.util.Vector
haver um erro no design orientado a objetos. Os puristas observam que ele também oferece muitos métodos além das operações tradicionalmente associadas a uma pilha (a saber: push, pop, peek, size). Também é possível fazersearch
,elementAt
,setElementAt
,remove
, e muitas outras operações de acesso aleatório. Basicamente, cabe ao usuário abster-se de usar as operações sem pilha deStack
.Por esses motivos de desempenho e design de POO, o JavaDoc for
java.util.Stack
recomendadoArrayDeque
como substituto natural. (Um deque é mais do que uma pilha, mas pelo menos está restrito a manipular as duas extremidades, em vez de oferecer acesso aleatório a tudo.)fonte