{"id":2179,"date":"2018-02-12T19:13:32","date_gmt":"2018-02-13T00:13:32","guid":{"rendered":"https:\/\/www.manualjava.net\/?p=2179"},"modified":"2018-03-06T14:14:21","modified_gmt":"2018-03-06T19:14:21","slug":"colecciones-en-java","status":"publish","type":"post","link":"https:\/\/www.manualjava.net\/?p=2179","title":{"rendered":"Colecciones en Java"},"content":{"rendered":"<p><img decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-2182\" src=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/java29.png\" alt=\"\" width=\"271\" height=\"111\" \/><\/p>\n<p><span style=\"color: #000000;\">Las colecciones proporcionan programaci\u00f3n gen\u00e9rica para muchas estructuras de datos. Una colecci\u00f3n es una agrupaci\u00f3n de objetos relacionados que forma una \u00fanica entidad, por ejemplo un arreglo de objetos, un conjunto&#8230; .El arreglo, el vector, la matriz, en general la Colecci\u00f3n es en s\u00ed mismo otro objeto que se debe crear.\u00a0<\/span><br \/>\n<!--more--><\/p>\n<h3><span style=\"color: #000000;\"><strong>Ejemplo<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0class Pueblo{ . . . }<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0class Puerto{ . . . }<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Pueblo []col1 = new Pueblo[100];<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0LinkedList &lt;String&gt; conCad = new LinkedList &lt;String&gt;();\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0\/\/ lista de cadenas<\/span><\/p>\n<p><span style=\"color: #000000;\">Las colecciones incluyen clases contenedoras para almacenar objetos, para acceder a los objetos en el interior de los contenedores y algoritmos para manipular los objetos (m\u00e9todos de clases). Las clases Colecci\u00f3n guardan objetos de cualquier tipo, de hecho el elemento base es Object y por consiguiente, debido a conversi\u00f3n autom\u00e1tica, se podr\u00e1 a\u00f1adir a la colecci\u00f3n un objeto de cualquier tipo. En el siguiente ejemplo crea una colecci\u00f3n b\u00e1sica, secuencial, con un arreglo, para guardar objetos de diferentes tipos.<\/span><\/p>\n<h3><span style=\"color: #000000;\"><strong>Ejemplo<\/strong><\/span><\/h3>\n<p><span style=\"color: #000000;\">Considerar una aplicaci\u00f3n en la que se debe almacenar N objetos del tipo Punto2D, Punto3D y PuntoPolar. Se realiza un almacenamiento secuencial, para ello se declara un arreglo de tipo Object. De esa forma se puede asignar cualquier objeto. El problema surge al recuperar los elementos del arreglo, se hace un cast al tipo clase, que puede ser Punto2D, Punto3D y PuntoPolar.<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0class Pueblo{ . . . }<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0class Puerto{ . . . }<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0class PuntoPolar{ . . . }<\/span><\/p>\n<p><span style=\"color: #000000;\">Declaraci\u00f3n y creaci\u00f3n del array de N elementos:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0final int N = 99;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0Object []rr = new Object[N];<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0int i=0;<\/span><\/p>\n<p><span style=\"color: #000000;\">Asignaci\u00f3n secuencial de objetos:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0mas = true;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0while(mas&amp;&amp;(i&lt;N)){<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0int opc;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0opc = menu();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0if(opc == 1)<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0rr[i++] = new Punto2D();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0else if(opc == 2)<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0rr[i++] = new Punto3D();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0if(opc == 3)<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0rr[i++] = new PuntoPolar();<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0else<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0mas = false;<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0}<\/span><\/p>\n<p><span style=\"color: #000000;\">Asignar elementos en un arreglo es una operaci\u00f3n muy eficiente. Una de las limitaciones de los arreglos es el tama\u00f1o; al ser de tama\u00f1o fijo, si se llena hay que ampliarlo. Por contra, una caracter\u00edstica importante de las clases Colecci\u00f3n es que se redimensionan autom\u00e1ticamente, el programador se despreocupa de controlar el n\u00famero de elementos, puede colocar tantos elementos como sea necesario.<\/span><\/p>\n<h3><strong><span style=\"color: #000000;\">Norma<\/span><\/strong><\/h3>\n<p><span style=\"color: #000000;\">Cuando se vaya a trabajar con tipos de datos simples, o cuando se conozca el tipo de dato de los elementos y el tama\u00f1o final, resulta muy eficiente utilizar arreglos (arrays). En cualquier otro caso, ser\u00e1 conveniente utilizar alguna de las colecciones del paquete java.util.\u00a0<span style=\"color: #000080;\"><a style=\"color: #000080;\" href=\"https:\/\/www.manualjava.net\/?p=1977\">(Ver arreglos unidimensionales)<\/a><\/span><\/span><\/p>\n<h2><span style=\"color: #000000;\"><strong>Tipos de colecciones<\/strong><\/span><\/h2>\n<p><span style=\"color: #000000;\">En las primeras versiones del JDK, Java 1.0 y 1.1, se incorporan colecciones b\u00e1sicas, aunque en la mayor\u00eda de las ocasiones son suficientes. Las m\u00e1s importantes son\u00a0<strong>Vector, Stack, Dictionary, HashTable\u00a0<\/strong>y la interfaz\u00a0<strong>Enumeration\u00a0<\/strong>para recorrer los elementos de una colecci\u00f3n.<\/span><\/p>\n<p><span style=\"color: #000000;\">Algunos componentes de la jerarqu\u00eda de colecciones.<\/span><\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"wp-image-2191 aligncenter\" src=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/Coleccion1-300x118.png\" alt=\"\" width=\"483\" height=\"190\" srcset=\"https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/Coleccion1-300x118.png 300w, https:\/\/www.manualjava.net\/wp-content\/uploads\/2018\/02\/Coleccion1.png 705w\" sizes=\"(max-width: 483px) 100vw, 483px\" \/><\/p>\n<p><span style=\"color: #000000;\">Java 2 (versiones 1.2 y posteriores) incorpora nuevas clases colecci\u00f3n, dentro del paquete java.util (API de las colecciones). Hay tres tipos de generales de colecciones:\u00a0<strong>conjuntos, listas y mapas<\/strong>; las interfaces Set, List y Map describen las caracter\u00edsticas generales de estas. Adem\u00e1s, la interfaz Collection especifica el comportamiento com\u00fan de las colecciones. El dise\u00f1o de estas colecciones tuvo muy\u00a0 en cuenta los problemas de seguridad que pudieran surgir en la ejecuci\u00f3n de m\u00faltiples tareas. De tal forma que si varios hilos acceden a una de estas estructuras se garantiza que los accesos est\u00e1n sincronizados, es decir que hasta que un hilo no termina de procesar los elementos de una colecci\u00f3n no hay otro hilo que procese la misma colecci\u00f3n. El problema de todo esto es que ralentiza la ejecuci\u00f3n de la aplicaci\u00f3n, adem\u00e1s, aun cuando no sean necesario los comportamientos sincronizados, no hay forma de desactivar las comprobaciones de sincronizaci\u00f3n. A continuaci\u00f3n se escribe la declaraci\u00f3n de m\u00e9todos de la clase Stack, todos ellos con el comportamiento de sincronizaci\u00f3n.<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0public synchronized int size()<br \/>\n<\/span>\u00a0 \u00a0 \u00a0 <span style=\"color: #000000;\">\u00a0public synchronized boolean isEmpty()<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0public synchronized boolean contains(Object elemento)<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0public synchronized Object put(Object clave, Object valor)<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0public synchronized Object remove(Object clave)<\/span><\/p>\n<p><span style=\"color: #000000;\">Las nuevas clases Colecci\u00f3n, a\u00f1adidas en Java 2, se han dise\u00f1ado sin el comportamiento de sincronizaci\u00f3n, al menos directamente. Por ejemplo, obs\u00e9rvese la siguiente declaraci\u00f3n de m\u00e9todos de la colecci\u00f3n ArrayList:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 public int size()<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 public boolean isEmpty()<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 public boolean contains(Object elemento)<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 public Object get(int index)<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 public Object set(int index, Object elemento)<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 public boolean add(Object elemento)<\/span><br \/>\n<span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 public Object remove(int index)<\/span><\/p>\n<p><span style=\"color: #000000;\">Ahora bien, hay aplicaciones en las que interesa proteger a una colecci\u00f3n de modificaciones simult\u00e1neas por m\u00e1s de un hilo (Thread). Entonces, para a\u00f1adir la cualidad de sincronizaci\u00f3n a las colecciones Java 2 dispone de un mecanismo que dota de ese comportamiento a una colecci\u00f3n. Esto est\u00e1 implementado mediante m\u00e9todos static de la clase Collections, por ejemplo:<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 ArrayList vd = new ArrayList();<\/span><\/p>\n<p><span style=\"color: #000000;\">A continuaci\u00f3n se le dota de sincronizaci\u00f3n.<\/span><\/p>\n<p><span style=\"color: #000000;\">\u00a0 \u00a0 \u00a0 \u00a0 vd = Collections.synchronizedList(vd);<\/span><\/p>\n<p><span style=\"color: #000000;\">Para un mapa el m\u00e9todo Collections.synchronizedMap(), para un conjunto Collections.synchronizedSortedSet(); y as\u00ed para otras colecciones.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Las colecciones proporcionan programaci\u00f3n gen\u00e9rica para muchas estructuras de datos. Una colecci\u00f3n es una agrupaci\u00f3n de objetos relacionados que forma una \u00fanica entidad, por ejemplo un arreglo de objetos, un conjunto&#8230; .El arreglo, el vector, la matriz, en general la Colecci\u00f3n es en s\u00ed mismo otro objeto que se debe crear.\u00a0<\/p><p><a class=\"more-link btn\" href=\"https:\/\/www.manualjava.net\/?p=2179\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":2182,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"_links":{"self":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2179"}],"collection":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2179"}],"version-history":[{"count":19,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2179\/revisions"}],"predecessor-version":[{"id":2714,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/posts\/2179\/revisions\/2714"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=\/wp\/v2\/media\/2182"}],"wp:attachment":[{"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2179"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2179"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.manualjava.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}