vectores, listas y collection

184 views
Skip to first unread message

aprendizjava

unread,
Aug 9, 2006, 1:52:00 PM8/9/06
to JavaSOS
recien empiezo a programar y tengo una duda, que diferencia hay entre
los vectores las listas y las colecciones y como saber cual me conviene
usar mas ?


muchas gracias!

Pablo Augusto Sznajdleder

unread,
Aug 9, 2006, 2:33:01 PM8/9/06
to jav...@googlegroups.com
Hola Gaston, te cuento como es el tema:

En Java existe lo que se llama "interfaces". Una interface es una definicion de metodos abstractos y mas de una clase puede implementar una interface.

En particular, en este caso vos hablas de Collection. Collection es una interface cuyos metodos los podes ver en esta direccion:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collection.html

Es decir:  varias clases pueden implementar Collection. Este es el caso de Vector y ArrayList (entre otras). Fijate:
http://java.sun.com/j2se/1.4.2/docs/api/java/util/Vector.html
http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html

Esto significa que si consideras el conjunto de metodos de la clase Vector y el conjunto de metodos de la clase ArrayList, en la interseccion de ambos conjuntos vas a encontrar los metodos definidos en la interface Collection, ya que ambas clases la implementan.

Por otro lado, los objetos de una clase que implementa una interface machean contra el tipo de datos de esa misma interface. Esto lo podes ver en este ejemplo:

Collection collA=new Vector();
Collection collB=new ArrayList();

Como ves, podes asignar a una variable de tipo Collection un objeto de cualquier clase siempre y cuando esa clase implemente Collection.

Cual te conviene utilizar??

Yo generalmente utilizo Vector, pero mucha gente utiliza ArrayList.

Suponete que tenes que escribir un metodo que devuelve una coleccion de Personas (instancias de la clase Persona)

public class Persona
{
      private int edad;
      private String nom;

      public Persona(String n,int e)
      {
             this.nom=n;
             this.edad=e;
      }
      public Collection obtenerLista()
      {
             Vector v=new Vector();
             v.add( new Persona("Jose",30) );  
             v.add( new Persona("Carlos",25) );
             v.add( new Persona("Pablo",32) );
             return v;
      }

      public String toString()
      {
             return nom+", "+edad;
      }
}

Ahora, si yo tengo una funcion main() en la cual voy a usar el metodo anterior seria asi:

public class Test
{
      public static void main(String args[])
      {
            Persona p=new Persona();
            Collection coll=p.obtenerLista();

            Persona aux;
            for(Iterator it=coll.iterator(); it.hasNext(); )
            {
                   aux=(Persona)it.next();
                   System.out.println( aux );
            }
      }
}

Como podes ver el metodo obtenerLista retorna una Collection y en el main tengo que utilizarlo como una Collection porque no puedo "presumir" que detras de esa Collection exista un Vector u otra clase. Es decir: un Vector es una Collection pero una Collection no necesariamente es un Vector. Podria ser un objeto de cualquier clase que implemente Collection.

Lo mismo pasa con List.  List es otra interface y varias clases (entre ellas ArrayList y Vector) la implementan. Asi que todo lo anterior tambien aplica para List.

Por ultimo, podes utilizar tambien arrays como en cualquier lenguaje.

int a[]=new int[3];
String b=new String[3];

a y b son arrays de 3 elementos cada uno, pero a solo puede contener enteros y b solo puede contener Strings.

La diferencia entre un array y (por ejemplo) un Vector es que el array es una estructura primitiva del lenguaje. Vos no podes "programar un array". En cambio Vector es una clase que alguien la programo. Existe el archivo Vector.java.

El array es estatico y es de un tipo de datos en particular. Obviamente si definis un Object[] te sirve para cualquier tipo de objeto. Pero si lo definis de n posiciones entonces ocupara exactamente n posiciones. Ni mas ni menos. y No puede crecer.

El Vector "crece y decrece" y siempre es de Object (salvo que uses una especializacion de Java5) que seria asi:

Vector<String> v=new Vector<String>();
v.add("Hola");
v.add ("Chau");

String s=v.get(1);

Saludos !!









(5411) 4637-8879  |  15-4419-JAVA (5282)

email: pab...@pablosz.com.ar
skype: pabloszn
http://www.PabloSZ.com.ar
http://www.JavaSOS.com.ar

Fernando Vidal

unread,
Aug 9, 2006, 3:10:57 PM8/9/06
to jav...@googlegroups.com
Que tal Gaston?
 
Te comento un poco como es el tema de las colecciones en Java.
 
Tenes basicamente 3 estructuras: una de lista (List), otra de conjuntos (Set) y otra de mapa (Map). Para cada uno de estos casos existen clases que implementan las interfases que proporcionan las funcionalidades que dichas clases deben definir.
 
Las estructuras de lista (implementan la interfase java.util.List) guardan la información con un orden determinado (la misma puede repetirse), con lo cual podes acceder a los elementos a traves de un índice.
Para este caso tenes, por ejemplo, las clases java.util.ArrayList y java.util.Vector, cuya funcionalidad es la misma, salvo porque la clase Vector es thread-safe (se garantiza que el acceso a sus elementos se hace de modo seguro).
 
En cuanto a las estructuras de conjuntos (implementan la interfase java.util.Set) guardan la información sin orden alguno (los elementos no pueden accederse a traves de un indice) y la misma no puede repetirse. Podes ver la clase java.util.HashSet por ejemplo.
 
Las estructuras de mapa (implementan la interfase java.util.Map) guardan la información como pares de atributos <clave, valor>, donde accedes al valor por medio de la clave.
Tenes como ejemplo las clases java.util.Hashtable y java.util.HashMap.
 
En cuanto a cual te conviene mas, eso va a depender de que es lo que quieras hacer, si vas a mostrar la informacion en orden, te sugiero usar una clase que implemente la interfase java.util.List; si queres acceder a elementos a traves de una clave univoca que los identifique, quizas te convenga utilizar una tabla de hash (clase Hashtable) o un mapa (HashMap).
 
También si la información la queres mantener ordenada en memoria, existen las clases TreeMap y TreeSet (la guardan dentro de una estructura de arbol).
 
Para mas información tenes este tutorial de sun:
 
Espero que te sirva
 
Saludos
 
    Fernando.-
 

 
2006/8/9, aprendizjava <gaston...@gmail.com>:

MatyX

unread,
Aug 9, 2006, 3:17:15 PM8/9/06
to jav...@googlegroups.com
Este es, a mí entender, un asunto muy importante y que
por lo general no se le da mucha bola.

Para empezar, tenemos la interfaces Collection y List.
La segunda extiende a la primera.

Java provee varias listas: ArrayList, LinkedList,
Vector, y algunas más.

Dependiendo del uso que tengas, tendrás que usar una u
otra. La idea es la siguiente, si bien no debería
interesarnos la implementación interna de cada una de
esas listas, es necesario para saber cuál usar.

ArrayList es una lista hecha sobre un array creciente.
Cuando se agrega un elemento, todos los posteriores
son movidos una posición ( se usa System.copyArray()
).

LinkedList es una lista enlazada, con todo lo que eso
implica.

Vector no sé cómo se implementa, pero sé que está
sincronizada. Si realmente no necesitás sincronizar tu
lista, no recomiendo que la uses.

Yo hice algunas pruebas y llegué a la siguiente
conclusión:

- Si la mayoría de los nuevos elementos van a ser
insertados al final, te conviene ArrayList. La
inserción es rápida y como insertás al final, no hace
falta mover nada.

- Si la mayoría de los nuevos elementos van a ser
insertados en la posición 0, te conviene LinkedList.
El costo principal que tenés es la instanciación del
nuevo nodo. Pero ArrayList tendría que mover todos los
elementos una posición. (LinkedList guarda una
referencia al primer y último nodo).

- Si la inserción es en posiciones aleatorias,
conviene ArrayList.


Si la performance es crucial para tu aplicación,
tendrías que ver qué otros usos le vas a dar a la
lista (get(), remove(), etc) y analizar cada caso en
particular. Por ejemplo, para hacer get() en
posiciones aleatorias, probablemente te convenga usar
TreeList (no viene en java.lang, sino en Commons
Collections de Jakarta Apache), etc.

También tenés sets, HashSet, TreeSet, etc. Los sets no
soportan elementos repetidos. Es útil en algunos
casos. El HashSet, como usa hashing, es rápida a la
hora de buscar elementos...


Espero haberte sido de ayuda.


Salu2!


MatyX.





__________________________________________________
Preguntá. Respondé. Descubrí.
Todo lo que querías saber, y lo que ni imaginabas,
está en Yahoo! Respuestas (Beta).
¡Probalo ya!
http://www.yahoo.com.ar/respuestas

Jose Mora Fallas

unread,
Aug 9, 2006, 3:23:23 PM8/9/06
to jav...@googlegroups.com
Creo que has recibido excelentes respuestas, pero además te recomiendo que le des un vistazo a esta dirección: http://www.itapizaco.edu.mx/paginas/JavaTut/froufe/parte8/cap8-7.html

--
_________________________
Jose Manuel Mora Fallas
www.acto.go.cr
Reply all
Reply to author
Forward
0 new messages