SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
      
Java  World     Capítulo  7     2  
       




  
                                                                                                                                                                               h
                                                                                                                                      
                                                                                                                                                                               t
                                                                                                                                                                               t
                                                                                                                                                                               p
                                                                                                                                                                               :
                                                                                                                                                                               /
                                                                                                                                                                               /
                                                                                                                                                                               g
                                                                                                                                                                               u
                                                                                                                                                                               s
                                                                                                                                                                               t
                                                                                                                                                                               a
                                                                                                                                                                               v
                                                                                                                                                                               o
                                                                                                                                                                               a
                                                                                                                                                                               l
                                                                                                                                                                               b
                                                                                                                                                                               e
          Bienvenidos                                                                                                                                                          r
                                                                                                                                                                               o
            
          Nos  encontramos  nuevamente  en  otra  entrega  de  JavaWorld.  En  el  capítulo  anterior  comenzamos  a  adentrarnos  en  la  API  de  Java  
                                                                                                                                                                               l
          para  Escritura/Lectura  de  archivos  y  serialización  de  clases.  En  este  capítulo  nos  toca  la  API  para  Colecciones  y  clases  genéricas.               a
                                                                                                                                                                               .
          Tanto  el  capítulo  anterior  como  este  requieren  que  aprendan  como  y  para  que  funciona  cada  clase,  como  así  también,  cada  uno                      b
          de  sus  métodos,  de  manera  que  se  recomienda  realizar  mucha  ejercitación.                                                                                   l
            
                                                                                                                                                                               o
                                                           
                                                                                                                                                                               g
                                                                                                                                                                               s
                                                                                                                                                                               p
                                                                                                                                                                               o
                                                                                                                                                                               t
                                                                                                                                                                               .
                                                                                                                                                                               c
                                                                                                                                                                               o
                                                                                                                                                                               m  




       
3          Java  World     Capítulo  7  
              




h
t
            Métodos  del  objeto  object  
t
p           Método                                 Descripcion  
:           boolean  equals(Object)                Interpreta  cuando  dos  objetos  son  equivalentes.  
            void  finalize()                       Método  invocado  por  el  Garbage  Collector  (Recolector  de  basura).  
/
            int  hashCode()                        Devuelve  un  valor  de  hash  para  poder  ser  utilizado  en  colecciones  que  utilizan  hashing.  
/
            final  void  notify()                  Despierta  un  hilo  de  ejecución  que  estuviera  esperando  a  este  objeto.  
v
            final  void  notifyAll()               Despierta  todos  los  hilos  de  ejecución  que  estuvieran  esperando  a  este  objeto.  
a
            final  void  wait()                    Hace   que   el   hilo   de   ejecución   pase   a   inactividad   hasta   que   otro   objeto   llame   a   notify()   o   notifyAll()  
l                                                  sobre  el  mismo.  
o           String  toString()                     Genera  una  representación  del  objeto  en  un  String.  
r           finalize()  fue  tratado  en  el  cap.  3.  
c           notify(),  notifyAll(),  y  wait()  se  verán  en  el  capítulo  9.  
r
            El  método  toString()  
e
            El  método  toString()  es  el  encargado  de  transformar  un  objeto  en  una  cadena  de  texto.  
a
            Dado   que   el   método   está   contenido   en   java.lang.Object,  significa   que   todos   los   objetos   poseen   este   método.   Además,   es   posible  
t           sobrescribirlo,  de  manera  de  modificar  su  comportamiento.    
i           Normalmente  cuando  mostramos  un  objeto,  es  [nombre  de  la  clase]@[hash  code  de  la  clase].  
v
o              public  class  Persona  {  
                   private  int  edad;;  
.                  private  String  nombre;;  
b                    
                   static  public  void  main(String[]  args)  {  
l                      System.out.println(new  Persona("Venito",  32));;          
o                  }      
                   public  Persona(String  nombre,  int  edad)  {  
g                      this.edad  =  edad;;  
s                      this.nombre  =  nombre;;  
p                  }        
               }  
o
                 
t
.
c                                     Persona@3e25a5  
                                        
o
m             
            Ahora  si  sobrescribimos  el  método  toString  de  la  siguiente  manera,  podemos  obtener  una  representación  más  legible  del  objeto:  


                 public  String  toString()  {  
                       return  "La  persona  llamada  "  +  nombre  +  "  tiene  "  +  edad  +  "  año(s).";;  
                 }  
              



                                       La  persona  llamada  Venito  tiene  32  año(s).  
                                         

              
                                                            

              
Java  World     Capítulo  7     4  
  




Sobrescribiendo  el  método  equals()                                                                                                                                  h
El  método  equals()  indica  si  dos  objetos  son  iguales  (contienen  los  mismos  atributos  y  son  del  mismo  tipo).                                           t
Ahora,  cual  es  la  diferencia  entre  ==  y  equals().                                                                                                              t
                                                                                                                                                                       p
          ==               Compara  las  referencias  entre  dos  variables,  e  indica  si  las  mismas  apuntan  al  mismo  objeto.  
          equals()  Compara  dos  objetos  e  indica  si  los  mismos  son  equivalentes  con  respecto  al  valor  de  sus  atributos.  
                                                                                                                                                                       :
                                                                                                                                                                       /
                                                                                                                                                                       /
                           
                         Las  clases  String  y  todos  los  wrappers  de  los  tipos  primitivos  tienen  sobrescrito  el  método  equals().  
                                                                                                                                                                       g
                                                                                                                                                                       u
                                                                                                                                                                       s
    
                                                                                                                                                                       t
Veamos  un  poco  de  código  como  ejemplo:  
                                                                                                                                                                       a
                                                                                                                                                                       v
   public  class  Prueba  {  
       static  public  void  main(String[]  args)  {                                                                                                                   o
           Valor  obj_1  =  new  Valor(17);;                                                                                                                           a
           Valor  obj_2  =  new  Valor(17);;  
           Valor  obj_3  =  obj_2;;                                                                                                                                    l
                                                                                                                                                                       b
           System.out.println("es  obj_1  ==  obj_2        ?  "  +  (obj_1==obj_2));;  
           System.out.println("es  obj_1  equals  obj_2?  "  +  (obj_1.equals(obj_2)));;                                                                               e
                                                                                                                                                                       r
           System.out.println("es  obj_2  ==  obj_3        ?  "  +  (obj_2==obj_3));;                                                                                  o
           System.out.println("es  obj_2  equals  obj_3?  "  +  (obj_2.equals(obj_3)));;  
       }                                                                                                                                                               l
   }                                                                                                                                                                   a
     
   class  Valor  {                                                                                                                                                     .
       private  int  valor;;                                                                                                                                           b
       public  Valor(int  valor)  {    
           this.valor  =  valor;;    
                                                                                                                                                                       l
       }                                                                                                                                                               o
       public  int  getValor()  {                                                                                                                                      g
           return  valor;;    
       }                                                                                                                                                               s
       public  boolean  equals(Object  obj)  {                                                                                                                         p
           boolean  resultado  =  false;;  
           if  (obj  instanceof  Valor)  {                                                                                                                             o
               if  (valor  ==  ((Valor)obj).getValor())  {                                                                                                             t
                   resultado  =  true;;  
               }  
                                                                                                                                                                       .
           }                                                                                                                                                           c
           return  resultado;;                                                                                                                                         o
       }  
   }                                                                                                                                                                   m  
     

                       es  obj_1  ==  obj_2        ?  false  
                       es  obj_1  equals  obj_2?  true  
                       es  obj_2  ==  obj_3        ?  true  
                       es  obj_2  equals  obj_3?  True  
                         
  
Cuando  hacemos  obj_1  ==  obj_2  devuelve  false  porque  los  objetos  a  los  que  apunta  cada  referencia  son  distintos.  
En  cambio  el  equals()  fue  sobrescrito  para  verificar  el  campo  valor  y  verificar  por  una  igualdad.  
  


  
5          Java  World     Capítulo  7  
              




h
                                          Recuerda  que  tanto  toString(),  equals(),  y  hashCode()  son  public.  El  intentar  sobrescribirlo  con  otro  
t                                         modificador  de  acceso  generaría  un  error  de  compilación.  
t                                           
p             
:           Sobrescribiendo  el  método  hashCode()  
/
            El  hashCode  es  un  identificador,  el  cual,  no  es  único.  Este  se  utiliza  para  aumentar  la  velocidad  de  búsqueda  en  grandes  colecciones  
/           de  datos,  de  manera  que  la  búsqueda  se  resuma  a  todos  aquellos  que  tengan  el  mismo  hashing.  
v           Para  el  examen  solo  es  necesario  saber  el  funcionamiento  de  este  método  y  que  sea  una  implementación  válida,  sin  importar  si  es  o  
a           no  eficiente.  
l           Un  código  hash  dentro  de  una  tabla  señala  solamente  un  grupo,  luego,  dentro  de  ese  grupo,  hay  que  buscar  el  objeto.  
o
r                                       Dado  que  el  hash  solo  marca  el  grupo  contenedor,  y  luego  hay  que  rastrear  el  objeto  dentro  de  ese  grupo,  
c                                       es  necesario  que  se  implemente  el  método  equals().  
r
e             
a           Dado  que  el  hash  se  utiliza  para  almacenar  y  para  obtener,  es  una  condición  básica  de  que  siempre  devuelva  el  mismo  código  para  el  
            mismo  objeto.  
t
            En   términos   de   código   hashing,   lo   más   performante   sería   tener   un   algoritmo   que   genere   un   código   hashing   distribuido  
i           uniformemente  para  todos  los  objetos,  aunque  también  es  válido  tener  un  hasing  que  siempre  devuelva  el  mismo  número  (cumple  
v           con  la  regla  de  el  mismo  hashing  para  el  mismo  objeto).  
o
            Contratos  a  cumplir  
.
b           Hashcode  
l                        El  mismo  objeto  debe  devolver  siempre  el  mismo  hash.  
o                        Si   según   equals()   dos   objetos   son   iguales,   la   llamada   a   hashcode   para   cada   uno   debe   devolver   el   mismo   valor  
g                        (obj1.hashcode()  ==  obj2.hashcode()).  
s                        Si  según  equals()  dos  objetos  son  diferentes,  la  llamada  a  hashcode  para  cada  uno  puede  llegar  a  devolver  el  mismo  valor,  
p                        pero  no  es  obligatorio.  
o           Equals  
t
.                        Si  a  equals  se  le  pasa  el  mismo  objeto  que  el  que  invoca  el  método,  el  resultado  debe  ser  siempre  true  (obj1.equals(obj1)).  
c                        Si   la   llamada   de   equals   entre   dos   objetos   devuelve   true,   los   operandos   pueden   ser   invertidos(obj1.equals(obj2)   ==  
                         obj2.equals(obj1)).  
o
                         Si  se  compara  cualquier  objeto  con  null,  este  debe  devolver  false  (  obj1.equals(null)  siempre  debe  ser  false).  
m  


            Colecciones  

                                         Es  posible  confundirse  en  el  examen  con  las  distintas  palabras  collection  
                                                  collection  (todo  en  minúsculas)           Nombre  para  identificar  cualquier  estructura  que  contenga  una  
                                                                                               colección  de  elementos,  y  permita  iterar  a  través  de  ellos.  
                                                  Collection  (con  C  mayúscula)              Interface  java.util.Collection.  
                                                  Collections   (con   C   mayúscula   y   s   Clase  java.util.Collections.  
                                                  al  final)  
                                           
              



              
Java  World     Capítulo  7           6  
     class Domain Model
  




                                                                                                                                                                                              h
                Serializable              Comparable<File>                        Obj ect
                                                                                                                                                                                              t
                                                                                                                                                                                              t
                    File                                                                                              InputStream                                                             p
                                                                                                                                                           FileInputStream
                                                                                                                                                                                              :
                                                                                                                                                                                              /
                               Writer                                         Reader
                                                                                                                                                         Obj ectInputStream
                                                                                                                                                                                              /
                                                                                                                                                                                              g
                                                                                                                                                                                              u
                                                                                                                          OutputStream
                                                                                                                                                                                              s
             BufferedWriter         OutputStreamWriter        InputStreamReader             BufferedReader                                                                                    t
                                                                                                                                                                                              a
                                                                                                                       FileOutputStream             Obj ectOutputStream
                                                                                                                                                                                              v
               PrintWriter              FileWriter               FileReader
                                                                                                                                                                                              o
                                                                                                                                                                                     
                                                                                                                                                                                              a
Características  de  cada  clase                                                                                                                                                              l
Una  colección  puede  clasificarse  de  la  siguiente  manera:                                                                                                                               b
                                                                                                                                                                                              e
                                                                         Colección  
                                                                                                                                                                                              r
                                                                                                                                                                                              o
                                                                                                                                                                                              l
                                  Distribución                                                               Orden            (sorted)  
                                    (order)  
                                                                                                                                                                                              a
                                                                                                                                                                                              .
                                                                                                                                                                                              b
               Distribuida                           No  distribuida                            Ordenada                                   Desordenada                                        l
                                                                                                                                                                                              o
Cada  colección  va  a  tener  un  atributo  de  Distribución  y  otro  de  Orden.                                                                                                            g
        Distribución:                   Indica  la  forma  en  que  los  elementos  son  almacenados  en  base  a  las  reglas  de  ordenamiento.                                             s
             o Distribuido              Los  elementos  son  ordenados  según  un  conjunto  de  reglas.                                                                                      p
             o No  distribuido          Los  elementos  no  se  ordenan  de  manera  definida.                                                                                                o
        Orden:                          Indica  la  forma  en  que  los  elementos  son  accedidos.                                                                                           t
             o Ordenado                 Se  itera  en  los  elementos  de  una  forma  definida.                                                                                              .
             o Desordenado              Se  itera  en  los  elementos  de  una  forma  que  pareciera  casi  aleatorea.  
                                                                                                                                                                                              c
List  <<interface>>                                                                                                                                                                           o
                                                                                                                                                                                              m  
Todas   las   listas   manejan   sus  
colecciones  mediante  índices.                                                                     <<interface>>                                <<interface>>  
Permiten   agregar   un   elemento                                                                       List                                       Queue  
dentro   de   la   colección   en   un  
índice   específico,   obtener   un  
elemento   de   la   colección   según  
el   índice,   y   buscar   en   que  
posición   se   encuentra   un   objeto  
                                                             ArrayList                                  Vector                                     LinkedList  
en  particular.  




  
7          Java  World     Capítulo  7  
              




            ArrayList               Funciona   como   un   array   que   puede   modificar   su   tamaño   dinámicamente.   Permite   acceder   aleatoriamente   a   sus  
h                                   elementos.  
t           Vector                  Se  comporta  exactamente  igual  que  el  ArrayList,  con  la  salvedad  de  que  es  Thread-­‐Safe  (multihilo  seguro).  
t           LinkedList              Mantiene  un  índice  aparte,  de  manera  que  se  puede  utilizar  como  una  cola,  o  como  un  simple  ArrayList.  
p                                   Añade  métodos  como  agregar  al  comienzo  o  al  final.  
:           Set  <<interface>>  
/           Los   sets   solo   manejan   objetos   únicos,   impidiendo   su  
/           duplicidad  dentro  de  la  colección.                                                                        <<interface>>  
v           Para   saber   si   un   objeto   ya   se   encuentra   agregado   en   la                                         Set  

a           colección,   es   necesario   que   se   implemente   el   método  
l           equals().                                                                                                                           <<interface>>  
                                                                                                         HashSet  
                                                                                                                                                 ShortedSet  
o
              
r             
c             
                                                                                                     LinkedHashSet                              <<interface>>  
r                                                                                                                                               NavigableSet  
e
a
t                                                                                                                                                   TreeSet  

i           HashSet         Los  códigos  se  almacenan  sin  un  orden  definido,  utilizando  como  identificador  su  código  de  hash.  
v           LinkedHashSet   Se   comporta   como   HashSet   con   la   salvedad   de   que   esta   mantiene   otro   índice,   el   cual   almacena   el   orden   de   los  
o                           elementos  según  fueron  siendo  insertados  en  la  colección.  
            TreeSet                                                                                                                              a  colección  requieren  
.
                            implementar  Comparable  o  Comparator.  
b
            Map  <<interface>>  
l
o           Los   maps   corresponden   con   la  
            funcionalidad   de   los   sets,   con   la                                                                <<interface>>  
g                                                                                                                          Map  
            diferencia   de   que   los   maps   no  
s           tienen  restricciones  en  cuanto  a  la  
p           duplicidad  de  sus  elementos.  
                                                                   Hashtable                         HashMap                                 <<interface>>  
o           Al  igual  que  los  sets,  requiere  que                                                                                         ShortedMap  
t           se   implemente   equals()   y  
.           hashCode().  
c                                                                                                                                            <<interface>>  
                                                                                                 LinkedHashMap  
                                                                                                                                             NavigableMap  
o
              
m             
                                                                                                                                                TreeMap  

            HashMap                    Los  códigos  se  almacenan  sin  un  orden  definido,  utilizando  como  identificador  su  código  de  hash.  
            Hashtable                  Se  comporta  como  HashMap,  con  la  salvedad  de  que  es  Thread-­‐Safe  (multihilo  seguro).  
            LinkedHashMap              Se  comporta  como  HashMap  con  la  salvedad  de  que  esta  mantiene  otro  índice,  el  cual  almacena  el  orden  de  los  
                                       elementos  según  fueron  siendo  insertados  en  la  colección.  
            TreeMap                                                                                                      bjetos   almacenados   en   esta   colección  
                                       requieren  implementar  Comparable  o  Comparator.  
              
                                                          




              
Java  World     Capítulo  7     8  
  




Queue  <<interface>>                                                                                                                                               h
                                                                                                                                                                   t
comportamiento   puede   variar,   pero   se   comportan   por                      <<interface>>                        <<interface>>                             t
defecto  como  una  cola  o  FIFO,  First-­‐In     First-­‐Out  (Primero                 List                               Queue                                  p
en  entrar     primero  en  salir).  
                                                                                                                                                                   :
  
                                                                                                                                                                   /
  
LinkedList         Ver  interface  List.                                                                                                                           /
                                                                                      LinkedList                        PriorityQueue  
PriorityQueue   Es  una  lista  por  defecto  FIFO  con  prioridad.                                                                                                g
                   Requiere           la   implementación             de                                                                                           u
                   Comparable.                                                                                                                                     s
Resumen  de  las  clases  de  collection                                                                                                                           t
Clase                     Map      Set      List      Queue     Distribución  (order)                       Orden  (sorted)                                        a
HashMap                     X                                   No                                          No                                                     v
Hashtable                   X                                   No                                          No                                                     o
TreeMap                     X                                   Por  orden                                  Por   orden   natural   o   reglas   de                a
                                                                (sorted)                                    comparación.  
                                                                                                                                                                   l
LinkedHashMap               X                                   Por   orden   de   inserción   o   último   No  
                                                                                                                                                                   b
                                                                acceso.  
HashSet                              X                          No                                          No                                                     e
TreeSet                              X                          Por  orden                                  Por   orden   natural   o   reglas   de                r
                                                                (sorted)                                    comparación.                                           o
LinkedHashSet                        X                          Por  orden  de  inserción                   No                                                     l
ArrayList                                       X               Por  índice                                 No                                                     a
Verctor                                         X               Por  índice                                 No  
                                                                                                                                                                   .
LinkedList                                      X       X       Por  índice                                 No  
                                                                                                                                                                   b
PriorityQueue                                           X       Por  orden                                  Por  orden  de  prioridades.  
                                                                (sorted)                                                                                           l
                                                                                                                                                                   o
                                                                                                                                                                   g
ArrayList                                                                                                                                                          s
                                                                                                                                                                   p
java.util.ArrayList.  Representa  un  array  que  puede  modificar  su  tamaño  dinámicamente.  
Ventajas:                                                                                                                                                          o
                                                                                                                                                                   t
          Puede  crecer  dinámicamente                                                                                                                             .
          Provee  mecanismos  de  inserción  y  búsqueda  más  potentes  que  los  de  un  Array.  
                                                                                                                                                                   c
Ahora  que  conoces  las  interfaces  de  las  colecciones,  lo  mejor  es  utilizarlas.  Veamos  como  instanciar  un  ArrayList.                                 o
                                                                                                                                                                   m  
     import  java.util.List;;  
     import  java.util.ArrayList;;  
     //...  código  
     List  myArray  =  new  ArrayList();;  
     //O  también  podemos  hacer  uso  de  genéricos  
     List<String>  myArray  =  new  ArrayList<String>();;  
       
No  te  preocupes  por  los  genéricos,  ya  los  veremos  en  detalle  más  adelante.  
                                             



  
9          Java  World     Capítulo  7  
              




            Autoboxing  con  colecciones  
h
t           Las  colecciones  solo  pueden  majera  objetos,  no  primitivas.  En  versiones  previas  a   Java   5,  si  queríamos  agregar  una   primitiva  a  un  
t           Array  la  teníamos  que  codificar  manualmente  dentro  de  su  respectivo  Wrapper.  A  partir  de  Java  5,  de  esto  se  encarga  el  autoboxing.  

p
:                 //Antes  de  Java  5  
                  miArrayList.add(new  Integer(15));;  
/                   
/                 //A  partir  de  Java  5  
                  miArrayList.add(15);;  
v                   
a           Ordenando  colecciones  
l
                                           
o                                        Los  métodos  que  veremos  a  continuación,  solo  se  encuentran  disponibles  para  las  colecciones  List.  
r
c
              
r
e              import  java.util.ArrayList;;  
               import  java.util.Collections;;  
a              import  java.util.List;;  
t              public  class  PruebasCollections_001  {  
i                  static  public  void  main(String[]  args)  {  
                       List<String>  myArray  =  new  ArrayList<String>();;  
v                      myArray.add("JavaWorld");;  
o                      myArray.add("Gustavo  Alberola");;  
                       myArray.add("Leonardo  Blanco");;  
.                      myArray.add("Matias  Alvarez");;  
b                      //Mostramos  el  array  sin  orden  
                       System.out.println("Desordenado:  "  +  myArray.toString());;  
l
                       //El  ordenamiento  se  realiza  con  la  clase  Collections  
o                      Collections.sort(myArray);;  
g                      //Mostramos  el  array  ordenado  
                       System.out.println("Ordenado      :  "  +  myArray.toString());;  
s                  }  
p              }  
o                
            Como  puedes  observar,  el  ordenamiento  se  realizó  con  el  método  estático  sort  de  la  clase  java.util.Collections.  
t
.                                   Desordenado:  [JavaWorld,  Gustavo  Alberola,  Leonardo  Blanco,  Matias  
c                                   Alvarez]  
                                    Ordenado      :  [Gustavo  Alberola,  JavaWorld,  Leonardo  Blanco,  Matias  
o                                   Alvarez]    
m                                     
            Pero,   si   intentamos   hacer   este   ejercicio   con   elementos   dentro   del   ArrayList   que   no   sean   ni   Strings   ni   Wrappers   de   primitivas,  
            obtendremos  un  error.  

            La  interfaz  comparable  
            Si  queremos  hacer  que  nuestras  propias  clases  se  puedan  ordenar,  deberemos  de  implementar  dicha  interfaz  y  definir  el  método  
            compareTo.  
            La  firma  de  este  método  es  int  compareTo(Object).  
            El  valor  devuelto  debe  ser:  

                         Negativo                Si  this  <  Object  
                         0                       Si  this  ==  Object  
                         Positivo                Si  this  >  Object  

            El  método  sort  utilizará  el  método  compareTo  para  ordenar  el  array.  

              
Java  World     Capítulo  7     10  
  




Existen  dos  maneras  de  declarar  el  método,  mediante  genéricos  y  mediante  la  notación  antigua.  
                                                                                                                                                             h
   //Utilizando  genéricos                                                                                                                                   t
   class  ImplementaGenerico  implements  Comparable<ImplementaGenerico>  {                                                                                  t
       //...  código  
       public  int  comparteTo(ImplementaGenerico  obj)  {                                                                                                   p
           //...  código                                                                                                                                     :
       }  
   }  
                                                                                                                                                             /
                                                                                                                                                             /
   //Utilizando  notación  antigua                                                                                                                           g
   class  ImplementaGenerico  implements  Comparable  {  
       //...  código                                                                                                                                         u
       public  int  compareTo(Object  obj)  {                                                                                                                s
           if  (obj  instanceof  ImplementaGenerico)  {  
               ImplementaGenerico  tmpObj  =  (ImplementaGenerico)  obj;;                                                                                    t
               //...  código                                                                                                                                 a
           }  
       }  
                                                                                                                                                             v
   }                                                                                                                                                         o
     
Utilizando  genéricos,  automáticamente  podemos  especificar  como  parámetro  el  mismo  tipo  de  la  clase,  en  cambio,  bajo  la  notación             a
antigua,  debemos  castear  el  objeto  recibido  a  dicho  tipo.                                                                                            l
La  interfaz  comparator                                                                                                                                     b
                                                                                                                                                             e
Bien,  vimos  la  interfaz  Comparable,  pero,  ¿que  pasaría  si  quisiéramos  ordenar  una  Clase  que  no  podemos  modificar,  u  ordenar  en  
                                                                                                                                                             r
más  de  una  forma  diferente?  
Comparator  al  rescate!                                                                                                                                     o
Si  vemos  el  método  sort,  podemos  encontrar  una  sobrecarga  que  recibe  como  segundo  parámetro  un  Comparator.                                    l
Veamos  cómo  crear  uno.                                                                                                                                    a
                                                                                                                                                             .
     import  java.util.List;;                                                                                                                                b
     import  java.util.ArrayList;;  
     import  java.util.Collections;;  
                                                                                                                                                             l
     import  java.util.Comparator;;                                                                                                                          o
                                                                                                                                                             g
     public  class  PruebasCollections_002  {  
         private  String  nombre;;                                                                                                                           s
         private  String  apellido;;                                                                                                                         p
         public  PruebasCollections_002(String  nombre,  String  apellido)  {  
             this.nombre  =  nombre;;                                                                                                                        o
             this.apellido  =  apellido;;                                                                                                                    t
         }  
         public  String  getNombre()  {  return  nombre;;  }  
                                                                                                                                                             .
         public  String  getApellido()  {  return  apellido;;  }                                                                                             c
         public  String  toString()  {  return  nombre  +  "  "  +  apellido;;  }                                                                            o
           
         static  public  void  main(String[]  args)  {                                                                                                       m  
             List  myArray  =  new  ArrayList();;  
             myArray.add(new  PruebasCollections_002("Gustavo",  "Alberola"));;  
             myArray.add(new  PruebasCollections_002("Matias",  "Alvarez"));;  
             myArray.add(new  PruebasCollections_002("Leonardo",  "Blanco"));;  
             myArray.add(new  PruebasCollections_002("Java",  "World"));;  
             //Mostramos  la  coleccion  tal  cual  está  ahora  
             System.out.println("Desordenada                    :  "  +  myArray.toString());;  
             //Ordenamos  por  nombre  
             Collections.sort(myArray,  new  ComparatorByNombre());;  
             System.out.println("Ordenada  por  nombre    :  "  +  myArray.toString());;  
               
  


  
11          Java  World     Capítulo  7  
           




h                     //Ordenamos  por  apellido  
t                     Collections.sort(myArray,  new  ComparatorByApellido());;  
                      System.out.println("Ordenada  por  apellido:  "  +  myArray.toString());;  
t                 }  
p             }  
:               
              class  ComparatorByNombre  implements  Comparator<PruebasCollections_002>  {  
/                 public  int  compare(PruebasCollections_002  obj1,  PruebasCollections_002  obj2)  {  
/                     return  obj1.getNombre().compareTo(obj2.getNombre());;  
                  }  
v             }  
a               
              class  ComparatorByApellido  implements  Comparator  {  
l                 public  int  compare(Object  obj1,  Object  obj2)  {  
o                     if  (obj1  instanceof  PruebasCollections_002  &&  obj2  instanceof  
r             PruebasCollections_002)  {  
                          return  
c             ((PruebasCollections_002)obj1).getApellido().compareTo(((PruebasCollections_002)obj2).
r             getApellido());;  
                      }  else  {  
e                         return  -­1;;  
a                     }  
                  }  
t             }  
i               
           
v
o             class  ComparatorByNombre  implements  Comparator<PruebasCollections_002>  {  
.                 public  int  compare(PruebasCollections_002  obj1,  PruebasCollections_002  obj2)  {  
                      return  obj1.getNombre().compareTo(obj2.getNombre());;  
b                 }  
l             }  
                
o             class  ComparatorByApellido  implements  Comparator  {  
g                 public  int  compare(Object  obj1,  Object  obj2)  {  
s                     if  (obj1  instanceof  PruebasCollections_002  &&  obj2  instanceof  
              PruebasCollections_002)  {  
p                         return  
o             ((PruebasCollections_002)obj1).getApellido().compareTo(((PruebasCollections_002)obj2).
              getApellido());;  
t                     }  else  {  
.                         return  -­1;;  
                      }  
c                 }  
o             }  
m               
           

                                    Desordenada                    :  [Gustavo  Alberola,  Matias  Alvarez,  Leonardo  
                                    Blanco,  Java  World]  
                                    Ordenada  por  nombre    :  [Gustavo  Alberola,  Java  World,  Leonardo  Blanco,  
                                    Matias  Alvarez]  
                                    Ordenada  por  apellido:  [Gustavo  Alberola,  Matias  Alvarez,  Leonardo  
                                    Blanco,  Java  World]  
                                      
           
           
                                                  



           
Java  World     Capítulo  7         12  
  




Comparable  vs  Comparator                                                                                                                                                         h
Ya  vimos  ambas  interfaces,  entonces,  ¿Cuándo  utilizar  una  o  la  otra?                                                                                                     t
Cuando   solo   queramos   definir   un   método   de   ordenamiento   en   una   clase   cuyo   código   fuente   podemos   acceder   y   modificar,                              t
utilizamos  Comparable.                                                                                                                                                            p
Cunado   queremos   implementar   varios   métodos   de   ordenamiento,   u   ordenar   una   clase   cuyo   código   no   tenemos   o   no   podemos  
                                                                                                                                                                                   :
modificar,  utilizamos  Comparator.  
                                                                                                                                                                                   /
Ordenando  con  la  clase  Arrays                                                                                                                                                  /
Las  firmas  de  los  métodos  son  iguales  que  Collections:  sort(Object)  y  sort(Object,  Comparator).  El  problema  radica  en  que  un  Array,  a                          g
diferencia  de  un  List,  puede  contener  elementos  de  tipo  primitivo.  ¿y,  cual  es  el  problema  entonces?                                                                u
Simple,  veamos  la  firma  de  Comparator:                                                                                                                                        s
public  int  compare(Object  obj1,  Object  obj2)                                                                                                                                  t
¿Sigues   sin   verlo?   Bueno,   aquí   va   una   pista:   Object.   Este   solo   recibe   objetos,   no   primitivas.   A   menos   que   se   almacenen   en   sus  
                                                                                                                                                                                   a
respectivos  Wrappers,  podemos  utilizar  las  sobrecargas  de  sort(Xx)  que  existen  para  cada  primitivo.  
                                                                                                                                                                                   v
                                                                                                                                                                                   o
                          Recuerda,   sort(Xx)   esta   sobrecargado   para   todos   los   tipos   de   primitivas,   siendo   Xx   el   tipo,   pero   cuando                    a
                          utilizas  un  Comparator  sort(Object,  Comparator)  no  puedes  jamás  utilizar  un  array  con  primitivas.  
                                                                                                                                                                                   l
                                                                                                                                                                                   b
                                                                                                                                                                                   e
Búsqueda  en  Arrays  y  Collections  
                                                                                                                                                                                   r
Ambas  clases  permiter  realizar  búsquedas  dentro  de  colecciones.  Para  ello,  necesitamos  conocer  las  siguientes  reglas:                                                o
                                                                                                                                                                                   l
           Las  búsquedas  son  realizadas  utilizando  el  método  binarySearch().  
           Las  búsquedas  exitosas  devuelven  un  int  con  el  índice  donde  se  encuentra  el  objeto.                                                                        a
           Si  la  búsqueda  no  encuentra  el  valor,  devuelve  un  valor  negativo.                                                                                             .
           La  colección  o  array  sobre  la  cual  buscar,  debe  de  haber  sido  previamente  ordenada.                                                                        b
           Si  no  cumples  con  el  paso  anterior,  el  resultado  puede  ser  impredecible.                                                                                     l
           Si  la  colección  o  array  se  encuentra  en  un  orden  natural,  la  búsqueda  se  debe  realizar  en  un  orden  natural.                                          o
           Si  la  colección  o  array  fue  ordenada  con  un  Comparator,  se  debe  utilizar  el  mismo  Comparator  para  realizar  la  búsqueda,                              g
           pasándolo  como  segundo  argumento  al  método  binarySearch().  
                                                                                                                                                                                   s
Veamos  un  ejemplo:                                                                                                                                                               p
                                                                                                                                                                                   o
     import  java.util.Comparator;;                                                                                                                                                t
     import  java.util.Arrays;;  
                                                                                                                                                                                   .
     public  class  PruebasCollections_003  {                                                                                                                                      c
         static  public  void  main(String[]  args)  {  
             String[]  myArray  =  {"uno",  "dos",  "tres",  "cuatro"};;                                                                                                           o
             for(String  s  :  myArray)  {                                                                                                                                         m  
                 System.out.print(s  +  "  ");;  
             }  
             System.out.println();;  
             System.out.println("Posicion  de  "tres":  "  +  Arrays.binarySearch(myArray,  
     "dos"));;  
             NuevoOrdenamiento  ordenador  =  new  NuevoOrdenamiento();;  
             Arrays.sort(myArray,  ordenador);;  
             for(String  s  :  myArray)  {  
                 System.out.print(s  +  "  ");;  
             }  


  


  
13           Java  World     Capítulo  7  
           




h                         System.out.println();;  
t                         System.out.println("Posicion  de  "tres":  "  +  Arrays.binarySearch(myArray,  
                  "dos"));;  
t                         System.out.println("Posicion  de  "tres":  "  +  Arrays.binarySearch(myArray,  "dos",  
p                 ordenador));;          
:                     }  
                  }  
/                   
/                 class  NuevoOrdenamiento  implements  Comparator<String>  {  
                      public  int  compare(String  obj1,  String  obj2)  {  
v                         return  obj2.compareTo(obj1);;  
a                     }  
                  }  
l
o          
r
                                      uno  dos  tres  cuatro  
c                                     Posicion  de  "tres":  1  
r                                     uno  tres  dos  cuatro  
                                      Posicion  de  "tres":  -­1  
e                                     Posicion  de  "tres":  2  
a                                       
           
t        Dado  que  en  la  segunda  búsqueda  (luego  del  nuevo  ordenamiento),  no  utilizamos  el  mismo  Comparator  para  la  búsqueda,  nos  dio  
i        como  resultado  -­‐1  (resultado  inesperado),  luego,  cuando  utilizamos  el  mismo  Comparator,  la  búsqueda  resultó  exitosa.  
v
o                                       Recuerda,  antes  de  buscar  en  una  colección,  esta  debe  de  haber  sido  previamente  ordenada,  y  la  búsqueda  
.                                       debe  realizarse  en  el  mismo  orden.  
b
l          
o        Conversion  de  Arrays  a  Lists  a  Arrays  
g
         Para  pasar  de  Array  a  List,  tenemos  el  método  Arrays.asList().  La  firma  del  método  es:  
s                                                                   
p        Algo   muy   importante   para   recordar.   Si   se   le   pasa   un   array,   generará   un   List   cuyos   elementos   apuntan   a   la   misma   dirección   de  
o        memoria  que  los  elementos  del  Array,  de  manera  que  si  modificamos  los  valores  en  uno,  se  verán  reflejados  en  el  otro.  
t        Para  pasar  de  List  a  Array,  tenemos  el  método  toArray().  Este  puede  generar  un  array  de  objetos,  o  se  le  puede  pasar  un  array  de  un  
.        tipo  determinado.  

c                 import  java.util.Arrays;;  
o                 import  java.util.Collections;;  
m                 import  java.util.List;;  
                  import  java.util.ArrayList;;  
                  public  class  PruebasCollections_004  {  
                      static  public  void  main(String[]  args)  {  
                          Integer[]  myArrayDeInts  =  {  1,  3,  12,  5,  47};;  
                          List  myListDeInts  =  Arrays.asList(myArrayDeInts);;  
                            
                          System.out.println(myListDeInts.size());;  
                          System.out.println(myListDeInts);;  
                          myListDeInts.set(4,  456);;  
                          for(int  a  :  myArrayDeInts)  {  
                              System.out.print(a  +  "  ");;  
                          }  
                          System.out.println();;  

           
                   

           
Java  World     Capítulo  7     14  
  




             Object[]  myArrayDeObjects  =  myListDeInts.toArray();;                                                                                                 h
             Integer[]  myArrayDeIntegers  =  new  Integer[5];;                                                                                                      t
             myListDeInts.toArray(myArrayDeIntegers);;  
                                                                                                                                                                     t
             myArrayDeIntegers[2]  =  555;;                                                                                                                          p
       
             for(int  a  :  myArrayDeInts)  {  
                                                                                                                                                                     :
                 System.out.print(a  +  "  ");;                                                                                                                      /
             }                                                                                                                                                       /
             System.out.println();;  
                                                                                                                                                                     g
             for(int  a  :  myArrayDeIntegers)  {                                                                                                                    u
                 System.out.print(a  +  "  ");;  
             }                                                                                                                                                       s
         }                                                                                                                                                           t
     }  
                                                                                                                                                                     a
       
                                                                                                                                                                     v
                                                                                                                                                                     o
                   5  
                   [1,  3,  12,  5,  47]                                                                                                                             a
                   1  3  12  5  456                                                                                                                                  l
                   1  3  12  5  456  
                   1  3  555  5  456  
                                                                                                                                                                     b
                                                                                                                                                                     e
  
                                                                                                                                                                     r
                    Si   intentas   convertir   un   array   de   primitivas   en   un   List,   no   generaras   un   error,   pero   no   se   generará            o
                    correctamente   el   List.   El   intentar   acceder   luego   a   alguno   de   sus   elementos   puede   lanzar   un                           l
                    ArrayIndexOutOfBoundsException.                                                                                                                  a
                                                                                                                                                                     .
                                                                                                                                                                     b
                                                                                                                                                                     l
                                                                                                                                                                     o
                                                                                                                                                                     g
                                                                                                                                                                     s
                                                                                                                                                                     p
                                                                                                                                                                     o
                                                                                                                                                                     t
                                                                                                                                                                     .
                                                                                                                                                                     c
                                                                                                                                                                     o
                                                                                                                                                                     m  




  
15          Java  World     Capítulo  7  
           




         Utilizando  los  Lists  
h
t        Lo  más  común  para  iterar  a  través  de  los  elementos  de  un  List  es  un  iterador  (también  se  puede  utilizar  un  simple  for-­‐each,  pero  con  
t        un  iterador  es  menos  acoplamiento).  
         El  iterador  posee  dos  métodos  simples:  
p
:                     boolean  hasNext()          Indica  si  aun  quedan  más  elementos.  No  nos  desplaza  de  la  posición  acutal  dentro  del  array.  
/                     Object  next()              Obtiene  el  elemento  actual,  y  desplaza  a  la  siguiente  posición  del  array.  
/
         A  partir  de  Java  5,  los  iteradores  también  soportan  genéricos.  Veamos  un  ejemplo:  
v
a             import  java.util.List;;  
l             import  java.util.Iterator;;  
              import  java.util.ArrayList;;  
o               
r             public  class  PruebasCollections_005  {  
c                 static  public  void  main(String[]  args)  {  
                      List<String>  myLista  =  new  ArrayList();;  
r                     myLista.add("JavaWorld");;  
e                     myLista.add("Dragon  Ball");;  
                      myLista.add("Pampita");;  
a                     Iterator<String>  it  =  myLista.iterator();;  
t                     while  (it.hasNext())  {  
                          String  s  =  it.next();;  
i                         System.out.print(s  +  "  ");;  
v                     }  
o                     System.out.println();;  
                        
.                     Iterator  it2  =  myLista.iterator();;  
b                     while  (it2.hasNext())  {  
                          String  s  =  (String)it2.next();;  
l                         System.out.print(s  +  "  ");;  
o                     }  
                  }  
g             }  
s               
           
p
o
                                   JavaWorld  Dragon  Ball  Pampita  
t                                  JavaWorld  Dragon  Ball  Pampita  
.                                    
c          
o        Como  podrán  apreciar,  cuando  utilizamos  el  iterador  con  genéricos,  no  hubo  que  castear  el  tipo  de  dato,  ya  que  automáticamente  se  
         obtiene  el  String.  En  el  segundo  caso,  es  necesario  realizar  el  casteo  explícitamente.  
m  
                                                     




           
Java  World     Capítulo  7     16  
  




Utilizando  los  Sets                                                                                                                                                    h
Recordemos  que  los  sets  almacenan  objetos  únicos  (no  existen  dos  elementos  que  respondan  a  x.equals(y)  ==  true).                                         t
En  los  Sets,  los  métodos  add  devuelven  un  valor  de  tipo  boolean,  que  indica  si  el  valor  fue  o  no  agregado  a  la  colección.                         t
Veamos  un  ejemplo:                                                                                                                                                     p
                                                                                                                                                                         :
     import  java.util.Set;;                                                                                                                                             /
     import  java.util.HashSet;;  
     import  java.util.TreeSet;;                                                                                                                                         /
                                                                                                                                                                         g
     public  class  PruebasCollections_006  {  
         static  public  void  main(String[]  args)  {  
                                                                                                                                                                         u
             boolean[]  resultados  =  new  boolean[4];;                                                                                                                 s
             Set  mySet  =  new  HashSet();;                                                                                                                             t
             resultados[0]  =  mySet.add(new  Integer(45));;  
             resultados[1]  =  mySet.add("b");;                                                                                                                          a
             resultados[2]  =  mySet.add(new  Object());;                                                                                                                v
             resultados[3]  =  mySet.add(45);;  //Se  produce  un  autoboxing  
                                                                                                                                                                         o
             System.out.println("Resultados  para  el  HashSet");;                                                                                                       a
             for(boolean  res  :  resultados)  {  
                 System.out.println(res);;  
                                                                                                                                                                         l
             }                                                                                                                                                           b
                                                                                                                                                                         e
               
             mySet  =  new  TreeSet();;                                                                                                                                  r
             resultados[0]  =  mySet.add("a");;                                                                                                                          o
             resultados[1]  =  mySet.add("b");;  
             resultados[2]  =  mySet.add("a");;                                                                                                                          l
             resultados[3]  =  mySet.add("c");;                                                                                                                          a
               
                                                                                                                                                                         .
             System.out.println("Resultados  para  el  TreeSet");;  
             for(boolean  res  :  resultados)  {                                                                                                                         b
                 System.out.println(res);;                                                                                                                               l
             }  
                                                                                                                                                                         o
             mySet.add(new  Integer(45));;  //Al  llegar  a  esta  línea  se  produce  una  excepción.                                                                   g
         }  
     }                                                                                                                                                                   s
                                                                                                                                                                         p
                                                                                                                                                                         o
                        Consola  
                        Resultados  para  el  HashSet                                                                                                                    t
                        true                                                                                                                                             .
                        true  
                        true                                                                                                                                             c
                        false                                                                                                                                            o
                        Resultados  para  el  TreeSet  
                        true  
                                                                                                                                                                         m  
                        true  
                        false  
                        true  
                        Exception  in  thread  "main"  java.lang.ClassCastException:  
                        java.lang.String  cannot  be  cast  to  java.lang.Integer  
                            at  java.lang.Integer.compareTo(Unknown  Source)  
                            at  java.util.TreeMap.put(Unknown  Source)  
                            at  java.util.TreeSet.add(Unknown  Source)  
                            at  PruebasCollections_006.main(PruebasCollections_006.java:XX)  
                          
  
  


  
17          Java  World     Capítulo  7  
           




h                                      
t                                    Dado   que   un   Tree   (árbol)   tiene   por   defecto   ordenamiento   natural,   los   elementos   deben   de   poder  
t                                    compararse  entre  sí.  
p
           
:
/        Utilizando  los  Maps  
/        Los  maps  se  manejan  almacenando  pares  clave/valor.  Veamos  un  poco  más  a  fondo  como  funciona  un  Map  para  inserción  y  para  
v        obtención  de  datos.  
a        Veamos  un  ejemplo  en  código:  

l
o             import  java.util.Map;;  
              import  java.util.HashMap;;  
r               
c             public  class  PruebasCollections_007  {  
                  static  public  void  main(String[]  args)  {  
r                     Map<Object,  Object>  myMap  =  new  HashMap<Object,  Object>();;  
e                     Persona  p1  =  new  Persona(45);;  
a                     Persona  p2  =  new  Persona(30);;  
                      Animal  a1  =  new  Animal(30);;  
t                       
i                     myMap.put(p1,  "Clave  persona1");;  
                      myMap.put(p2,  "Clave  persona2");;  
v                     myMap.put(a1,  "Clave  animal1");;  
o                       
                      System.out.println("1  -­  "  +  myMap.get(new  Persona(45)));;  
.                     System.out.println("2  -­  "  +  myMap.get(new  Persona(30)));;  
b                     System.out.println("3  -­  "  +  myMap.get(a1));;  
l                     System.out.println("4  -­  "  +  myMap.get(new  Animal(30)));;  
                      System.out.println("Cant:"  +  myMap.size());;  
o                 }  
g             }  
                
s             class  Persona  {  
p                 private  int  edad;;  
                  public  int  getEdad(){  return  edad;;  }  
o                 public  Persona(int  edad){  this.edad  =  edad;;  }  
t                 public  boolean  equals(Object  persona)  {  
.                     if  (persona  instanceof  Persona  &&  edad  ==  ((Persona)persona).getEdad())  {  
                          return  true;;  
c                     }  else  {  
o                         return  false;;  
                      }  
m                 }  
                  public  int  hashCode(){  return  edad;;  }  
              }  
                
              class  Animal  {  
                  int  edad;;  
                  public  int  getEdad(){  return  edad;;  }  
                  public  Animal(int  edad){  this.edad  =  edad;;  }  
              }      
                
           
           
           
           
           
           

           
Java  World     Capítulo  7         18  
  




                                                                                                                                                                                h
                        1  -­  Clave  persona1  
                        2  -­  Clave  persona2                                                                                                                                  t
                        3  -­  Clave  animal1                                                                                                                                   t
                        4  -­  null  
                        Cant:3                                                                                                                                                  p
                                                                                                                                                                                :
  
                                                
                                                                                                                                                                                /
Ok,  si  estas  dentro  de  este  grupo,  veamos  como  funcionan  las  colecciones  Map.                                                                                       /
                                                                                                                                                                                g
Insersión:  
                                                                                                                                                                                u
           Se  ingresa  el  par  clave/valor                                                                                                                                    s
           De  la  clave  se  obtiene  el  int  del  hashCode.                                                                                                                  t
           Se  almacena  el  valor  en  un  grupo  identificado  por  el  hashCode  del  paso  anterior.                                                                        a
                                                                                                                                                                                v
Obtención:  
                                                                                                                                                                                o
           Se  especifica  la  clave                                                                                                                                            a
           De  esta  se  obtiene  el  hashCode  y  se  busca  el  grupo                                                                                                         l
           Si  el  hashCode  existe,  se  comparan  mediante  equals  las  claves.                                                                                              b
           Si  son  equivalentes,  se  devuelve  el  valor  
                                                                                                                                                                                e
En   el   caso   de   Animal,   contiene   tanto   el   método   HashCode   como   equals   redefinido,   de   manera   que   al   crear   una   nueva   clase,   se            r
puede  encontrar  la  clave.                                                                                                                                                    o
Cuando   utilizamos   la   misma   instancia   de   Animal   (a1),   esta   primero   genera   el   mismo   HashCode   (utilizando   el   hash   por   defecto,                 l
generando  algo  como  Animal@44532),  y  luego  utiliza  el  equals.  Dado  que  este  último  no  esta  sobrescrito,  lo  que  hace  es  verificar  las                       a
posiciones  de  memoria.  Dado  que  es  la  misma  instancia  (esta  apuntando  al  mismo  objeto),  el  resultado  es  true.  
                                                                                                                                                                                .
Pero  cuando  creamos  un  nuevo  objeto  de  tipo  Animal,  por  más  que  este  tenga  las  mismas  características,  al  no  haber  sobrescrito  los  
métodos  equals  y  hashCode,  jamás  podremos  obtener  dicho  valor,  y  el  mismo  quedará  perdido  dentro  del  HashMap.  
                                                                                                                                                                                b
Es  muy  común  ver  ejemplos  en  los  que  como  clave  utilizan  Strings,  bien,  recuerda  que  tanto  los  Strings  como  los  Wrappers  de  los                           l
tipos  primitivos  sobrescriben  equals  y  hashCode,  de  manera  que  es  posible  utilizarlos  como  clave.                                                                  o
                                                                                                                                                                                g
                                                                                                                                                                                s
                                                                                                                                                                                p
                                                                                                                                                                                o
                                                                                                                                                                                t
                                                                                                                                                                                .
                                                                                                                                                                                c
                                                                                                                                                                                o
                                                                                                                                                                                m  




  
Java Colecciones Clases Genéricas
Java Colecciones Clases Genéricas
Java Colecciones Clases Genéricas
Java Colecciones Clases Genéricas
Java Colecciones Clases Genéricas
Java Colecciones Clases Genéricas
Java Colecciones Clases Genéricas
Java Colecciones Clases Genéricas
Java Colecciones Clases Genéricas
Java Colecciones Clases Genéricas
Java Colecciones Clases Genéricas
Java Colecciones Clases Genéricas

Contenu connexe

Tendances

Diagranacion periodico
Diagranacion periodicoDiagranacion periodico
Diagranacion periodicoJUan Feria
 
Monigote raro deforme
Monigote raro deformeMonigote raro deforme
Monigote raro deformearuiperezgil
 
Programación Enero Febrero 2011
Programación Enero Febrero 2011Programación Enero Febrero 2011
Programación Enero Febrero 2011Zaragoza Activa
 
Trampas de luz 09 al 15 de nov de 2012
Trampas de luz 09 al 15 de nov de 2012Trampas de luz 09 al 15 de nov de 2012
Trampas de luz 09 al 15 de nov de 2012Macarena Casuso
 
Los reciclados y sus proyectos
Los reciclados y sus proyectosLos reciclados y sus proyectos
Los reciclados y sus proyectosMeli Sanchez
 
Diagrama mcti
Diagrama mctiDiagrama mcti
Diagrama mctigrenyjoel
 
Plano esquemático de Bueu
Plano esquemático de BueuPlano esquemático de Bueu
Plano esquemático de BueuConcello de Bueu
 
National instruments presentation human capital group dirk willems
National instruments presentation human capital group   dirk willemsNational instruments presentation human capital group   dirk willems
National instruments presentation human capital group dirk willemsDirk Willems
 
Processos de Improbidade Administrativa do Aloisio Vieira
Processos de Improbidade Administrativa do Aloisio VieiraProcessos de Improbidade Administrativa do Aloisio Vieira
Processos de Improbidade Administrativa do Aloisio VieiraLuciano Viana
 
Presentación Objetivos enfermería de hospitalización
Presentación Objetivos enfermería de hospitalización Presentación Objetivos enfermería de hospitalización
Presentación Objetivos enfermería de hospitalización 982531786
 
Presentación atletismo
Presentación atletismoPresentación atletismo
Presentación atletismonachoydiego
 
Entrega finaaaaal
Entrega finaaaaalEntrega finaaaaal
Entrega finaaaaalnacho_0
 

Tendances (20)

JavaWorld - SCJP - Capitulo 6
JavaWorld - SCJP - Capitulo 6JavaWorld - SCJP - Capitulo 6
JavaWorld - SCJP - Capitulo 6
 
Diagranacion periodico
Diagranacion periodicoDiagranacion periodico
Diagranacion periodico
 
Monigote raro deforme
Monigote raro deformeMonigote raro deforme
Monigote raro deforme
 
Comic
ComicComic
Comic
 
Programación Enero Febrero 2011
Programación Enero Febrero 2011Programación Enero Febrero 2011
Programación Enero Febrero 2011
 
Anaga
AnagaAnaga
Anaga
 
Trampas de luz 09 al 15 de nov de 2012
Trampas de luz 09 al 15 de nov de 2012Trampas de luz 09 al 15 de nov de 2012
Trampas de luz 09 al 15 de nov de 2012
 
Podemoscast
PodemoscastPodemoscast
Podemoscast
 
Los reciclados y sus proyectos
Los reciclados y sus proyectosLos reciclados y sus proyectos
Los reciclados y sus proyectos
 
Diagrama mcti
Diagrama mctiDiagrama mcti
Diagrama mcti
 
Plano esquemático de Bueu
Plano esquemático de BueuPlano esquemático de Bueu
Plano esquemático de Bueu
 
National instruments presentation human capital group dirk willems
National instruments presentation human capital group   dirk willemsNational instruments presentation human capital group   dirk willems
National instruments presentation human capital group dirk willems
 
Xen Summit Asia 2009 Xen Arm Talk
Xen Summit Asia 2009 Xen Arm TalkXen Summit Asia 2009 Xen Arm Talk
Xen Summit Asia 2009 Xen Arm Talk
 
Processos de Improbidade Administrativa do Aloisio Vieira
Processos de Improbidade Administrativa do Aloisio VieiraProcessos de Improbidade Administrativa do Aloisio Vieira
Processos de Improbidade Administrativa do Aloisio Vieira
 
Lopez
LopezLopez
Lopez
 
Presentación Objetivos enfermería de hospitalización
Presentación Objetivos enfermería de hospitalización Presentación Objetivos enfermería de hospitalización
Presentación Objetivos enfermería de hospitalización
 
Linea desarrollo institucional
Linea  desarrollo institucionalLinea  desarrollo institucional
Linea desarrollo institucional
 
Triptico
TripticoTriptico
Triptico
 
Presentación atletismo
Presentación atletismoPresentación atletismo
Presentación atletismo
 
Entrega finaaaaal
Entrega finaaaaalEntrega finaaaaal
Entrega finaaaaal
 

En vedette (20)

Concrecion peou bustaldea
Concrecion peou bustaldeaConcrecion peou bustaldea
Concrecion peou bustaldea
 
"Fertilizacion asistida" o "Reproduccion Asistida"
"Fertilizacion asistida" o "Reproduccion Asistida""Fertilizacion asistida" o "Reproduccion Asistida"
"Fertilizacion asistida" o "Reproduccion Asistida"
 
F iso20k v1
F iso20k v1F iso20k v1
F iso20k v1
 
Plan REVIVE, BOPV, nº 146
Plan REVIVE, BOPV, nº 146Plan REVIVE, BOPV, nº 146
Plan REVIVE, BOPV, nº 146
 
Aprendiendo Economía con Los Simpson I
Aprendiendo Economía con Los Simpson IAprendiendo Economía con Los Simpson I
Aprendiendo Economía con Los Simpson I
 
1 presentacion 102951
1 presentacion 1029511 presentacion 102951
1 presentacion 102951
 
Guion clase 2 terminada
Guion clase 2 terminadaGuion clase 2 terminada
Guion clase 2 terminada
 
La materia
La materiaLa materia
La materia
 
Taller de repaso
Taller de repasoTaller de repaso
Taller de repaso
 
Unidad%20 i%20conocimientos%20basicos%201
Unidad%20 i%20conocimientos%20basicos%201Unidad%20 i%20conocimientos%20basicos%201
Unidad%20 i%20conocimientos%20basicos%201
 
Blog mami 2012
Blog mami 2012Blog mami 2012
Blog mami 2012
 
Evolver5 es
Evolver5 esEvolver5 es
Evolver5 es
 
Globo cristy
Globo cristyGlobo cristy
Globo cristy
 
Recoleccion de datos
Recoleccion de datosRecoleccion de datos
Recoleccion de datos
 
1 unidad7 aparato-respiratorio
1 unidad7 aparato-respiratorio1 unidad7 aparato-respiratorio
1 unidad7 aparato-respiratorio
 
Guia clase 3 terminada
Guia clase 3 terminadaGuia clase 3 terminada
Guia clase 3 terminada
 
Buscadores
BuscadoresBuscadores
Buscadores
 
Agua en aves
Agua en avesAgua en aves
Agua en aves
 
Exposicion
ExposicionExposicion
Exposicion
 
Dese
DeseDese
Dese
 

Similaire à Java Colecciones Clases Genéricas

Cap1 javaworld
Cap1 javaworldCap1 javaworld
Cap1 javaworldevanlitos
 
Historietas iznogud el malvado-horacio germán garcía
Historietas iznogud el malvado-horacio germán garcíaHistorietas iznogud el malvado-horacio germán garcía
Historietas iznogud el malvado-horacio germán garcíaHoracio Germán García
 
Examen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervisionExamen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervisiondemonia28
 
Unidad 5.- Sistemas de cruzamiento
Unidad 5.- Sistemas de cruzamientoUnidad 5.- Sistemas de cruzamiento
Unidad 5.- Sistemas de cruzamientoElenaRaimundez
 
1963 bar
1963 bar1963 bar
1963 baredusor
 
Folleto del museo_del_romanticismo
Folleto del museo_del_romanticismoFolleto del museo_del_romanticismo
Folleto del museo_del_romanticismoalvarpau
 
Ebook diadospais
Ebook diadospaisEbook diadospais
Ebook diadospaisAutonoma
 
Web enabled 2012
Web enabled 2012Web enabled 2012
Web enabled 2012Wiyingi
 
Moodle 1.9 Configuración del curso
Moodle 1.9  Configuración del cursoMoodle 1.9  Configuración del curso
Moodle 1.9 Configuración del cursoRamón OVELAR
 
Presentacion 1er Parcial
Presentacion 1er ParcialPresentacion 1er Parcial
Presentacion 1er ParcialSharlene
 

Similaire à Java Colecciones Clases Genéricas (13)

Cap1 javaworld
Cap1 javaworldCap1 javaworld
Cap1 javaworld
 
Historietas iznogud el malvado-horacio germán garcía
Historietas iznogud el malvado-horacio germán garcíaHistorietas iznogud el malvado-horacio germán garcía
Historietas iznogud el malvado-horacio germán garcía
 
Examen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervisionExamen de matematicas sexto grado supervision
Examen de matematicas sexto grado supervision
 
Unidad 5.- Sistemas de cruzamiento
Unidad 5.- Sistemas de cruzamientoUnidad 5.- Sistemas de cruzamiento
Unidad 5.- Sistemas de cruzamiento
 
Yo me anticipo!!
Yo me anticipo!!Yo me anticipo!!
Yo me anticipo!!
 
Marifé Soria_Patrimonio Arq.
Marifé Soria_Patrimonio Arq.Marifé Soria_Patrimonio Arq.
Marifé Soria_Patrimonio Arq.
 
1963 bar
1963 bar1963 bar
1963 bar
 
Mapa Valle
Mapa ValleMapa Valle
Mapa Valle
 
Folleto del museo_del_romanticismo
Folleto del museo_del_romanticismoFolleto del museo_del_romanticismo
Folleto del museo_del_romanticismo
 
Ebook diadospais
Ebook diadospaisEbook diadospais
Ebook diadospais
 
Web enabled 2012
Web enabled 2012Web enabled 2012
Web enabled 2012
 
Moodle 1.9 Configuración del curso
Moodle 1.9  Configuración del cursoMoodle 1.9  Configuración del curso
Moodle 1.9 Configuración del curso
 
Presentacion 1er Parcial
Presentacion 1er ParcialPresentacion 1er Parcial
Presentacion 1er Parcial
 

Plus de jorg_marq

Clase9 threads
Clase9 threadsClase9 threads
Clase9 threadsjorg_marq
 
Clase8 innerclasses
Clase8 innerclassesClase8 innerclasses
Clase8 innerclassesjorg_marq
 
Clase7 generics
Clase7 genericsClase7 generics
Clase7 genericsjorg_marq
 
Clase6 collections
Clase6 collectionsClase6 collections
Clase6 collectionsjorg_marq
 
Clase5 controldeflujo
Clase5 controldeflujoClase5 controldeflujo
Clase5 controldeflujojorg_marq
 
Clase4 operadores
Clase4 operadoresClase4 operadores
Clase4 operadoresjorg_marq
 
Clase3 asignaciones
Clase3 asignacionesClase3 asignaciones
Clase3 asignacionesjorg_marq
 
Clase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpooClase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpoojorg_marq
 
Clase1 introduccinalcurso
Clase1 introduccinalcursoClase1 introduccinalcurso
Clase1 introduccinalcursojorg_marq
 
Capitulos 8 9-10
Capitulos 8 9-10Capitulos 8 9-10
Capitulos 8 9-10jorg_marq
 
Clase10 stringsio
Clase10 stringsioClase10 stringsio
Clase10 stringsiojorg_marq
 
Whither cman
Whither cmanWhither cman
Whither cmanjorg_marq
 
Ex300 objectives
Ex300   objectivesEx300   objectives
Ex300 objectivesjorg_marq
 
Ex200 objectives
Ex200   objectivesEx200   objectives
Ex200 objectivesjorg_marq
 

Plus de jorg_marq (16)

Clase9 threads
Clase9 threadsClase9 threads
Clase9 threads
 
Clase8 innerclasses
Clase8 innerclassesClase8 innerclasses
Clase8 innerclasses
 
Clase7 generics
Clase7 genericsClase7 generics
Clase7 generics
 
Clase6 collections
Clase6 collectionsClase6 collections
Clase6 collections
 
Clase5 controldeflujo
Clase5 controldeflujoClase5 controldeflujo
Clase5 controldeflujo
 
Clase4 operadores
Clase4 operadoresClase4 operadores
Clase4 operadores
 
Clase3 asignaciones
Clase3 asignacionesClase3 asignaciones
Clase3 asignaciones
 
Clase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpooClase2 ejemplosdeenumpoo
Clase2 ejemplosdeenumpoo
 
Clase1 introduccinalcurso
Clase1 introduccinalcursoClase1 introduccinalcurso
Clase1 introduccinalcurso
 
Capitulos 8 9-10
Capitulos 8 9-10Capitulos 8 9-10
Capitulos 8 9-10
 
Capitulo 5
Capitulo 5Capitulo 5
Capitulo 5
 
Capitulo 4
Capitulo 4Capitulo 4
Capitulo 4
 
Clase10 stringsio
Clase10 stringsioClase10 stringsio
Clase10 stringsio
 
Whither cman
Whither cmanWhither cman
Whither cman
 
Ex300 objectives
Ex300   objectivesEx300   objectives
Ex300 objectives
 
Ex200 objectives
Ex200   objectivesEx200   objectives
Ex200 objectives
 

Java Colecciones Clases Genéricas

  • 1.    
  • 2. Java  World    Capítulo  7   2       h         t t p : / / g u s t a v o a l b e Bienvenidos   r o   Nos  encontramos  nuevamente  en  otra  entrega  de  JavaWorld.  En  el  capítulo  anterior  comenzamos  a  adentrarnos  en  la  API  de  Java   l para  Escritura/Lectura  de  archivos  y  serialización  de  clases.  En  este  capítulo  nos  toca  la  API  para  Colecciones  y  clases  genéricas.   a   . Tanto  el  capítulo  anterior  como  este  requieren  que  aprendan  como  y  para  que  funciona  cada  clase,  como  así  también,  cada  uno   b de  sus  métodos,  de  manera  que  se  recomienda  realizar  mucha  ejercitación.   l   o   g s p o t . c o m    
  • 3. 3   Java  World    Capítulo  7     h t Métodos  del  objeto  object   t p Método   Descripcion   : boolean  equals(Object)   Interpreta  cuando  dos  objetos  son  equivalentes.   void  finalize()   Método  invocado  por  el  Garbage  Collector  (Recolector  de  basura).   / int  hashCode()   Devuelve  un  valor  de  hash  para  poder  ser  utilizado  en  colecciones  que  utilizan  hashing.   / final  void  notify()   Despierta  un  hilo  de  ejecución  que  estuviera  esperando  a  este  objeto.   v final  void  notifyAll()   Despierta  todos  los  hilos  de  ejecución  que  estuvieran  esperando  a  este  objeto.   a final  void  wait()   Hace   que   el   hilo   de   ejecución   pase   a   inactividad   hasta   que   otro   objeto   llame   a   notify()   o   notifyAll()   l sobre  el  mismo.   o String  toString()   Genera  una  representación  del  objeto  en  un  String.   r finalize()  fue  tratado  en  el  cap.  3.   c notify(),  notifyAll(),  y  wait()  se  verán  en  el  capítulo  9.   r El  método  toString()   e El  método  toString()  es  el  encargado  de  transformar  un  objeto  en  una  cadena  de  texto.   a Dado   que   el   método   está   contenido   en   java.lang.Object,  significa   que   todos   los   objetos   poseen   este   método.   Además,   es   posible   t sobrescribirlo,  de  manera  de  modificar  su  comportamiento.     i Normalmente  cuando  mostramos  un  objeto,  es  [nombre  de  la  clase]@[hash  code  de  la  clase].   v o public  class  Persona  {      private  int  edad;;   .    private  String  nombre;;   b          static  public  void  main(String[]  args)  {   l        System.out.println(new  Persona("Venito",  32));;           o    }          public  Persona(String  nombre,  int  edad)  {   g        this.edad  =  edad;;   s        this.nombre  =  nombre;;   p    }         }   o     t . c Persona@3e25a5     o m     Ahora  si  sobrescribimos  el  método  toString  de  la  siguiente  manera,  podemos  obtener  una  representación  más  legible  del  objeto:   public  String  toString()  {     return  "La  persona  llamada  "  +  nombre  +  "  tiene  "  +  edad  +  "  año(s).";;   }     La  persona  llamada  Venito  tiene  32  año(s).            
  • 4. Java  World    Capítulo  7   4     Sobrescribiendo  el  método  equals()   h El  método  equals()  indica  si  dos  objetos  son  iguales  (contienen  los  mismos  atributos  y  son  del  mismo  tipo).   t Ahora,  cual  es  la  diferencia  entre  ==  y  equals().   t p ==     Compara  las  referencias  entre  dos  variables,  e  indica  si  las  mismas  apuntan  al  mismo  objeto.   equals()  Compara  dos  objetos  e  indica  si  los  mismos  son  equivalentes  con  respecto  al  valor  de  sus  atributos.   : / /   Las  clases  String  y  todos  los  wrappers  de  los  tipos  primitivos  tienen  sobrescrito  el  método  equals().   g   u s     t Veamos  un  poco  de  código  como  ejemplo:   a v public  class  Prueba  {      static  public  void  main(String[]  args)  {   o        Valor  obj_1  =  new  Valor(17);;   a        Valor  obj_2  =  new  Valor(17);;          Valor  obj_3  =  obj_2;;   l           b        System.out.println("es  obj_1  ==  obj_2        ?  "  +  (obj_1==obj_2));;          System.out.println("es  obj_1  equals  obj_2?  "  +  (obj_1.equals(obj_2)));;   e           r        System.out.println("es  obj_2  ==  obj_3        ?  "  +  (obj_2==obj_3));;   o        System.out.println("es  obj_2  equals  obj_3?  "  +  (obj_2.equals(obj_3)));;      }   l }   a   class  Valor  {   .    private  int  valor;;   b    public  Valor(int  valor)  {            this.valor  =  valor;;     l    }   o    public  int  getValor()  {     g        return  valor;;        }   s    public  boolean  equals(Object  obj)  {   p        boolean  resultado  =  false;;          if  (obj  instanceof  Valor)  {   o            if  (valor  ==  ((Valor)obj).getValor())  {   t                resultado  =  true;;              }   .        }   c        return  resultado;;   o    }   }   m       es  obj_1  ==  obj_2        ?  false   es  obj_1  equals  obj_2?  true   es  obj_2  ==  obj_3        ?  true   es  obj_2  equals  obj_3?  True       Cuando  hacemos  obj_1  ==  obj_2  devuelve  false  porque  los  objetos  a  los  que  apunta  cada  referencia  son  distintos.   En  cambio  el  equals()  fue  sobrescrito  para  verificar  el  campo  valor  y  verificar  por  una  igualdad.      
  • 5. 5   Java  World    Capítulo  7     h Recuerda  que  tanto  toString(),  equals(),  y  hashCode()  son  public.  El  intentar  sobrescribirlo  con  otro   t modificador  de  acceso  generaría  un  error  de  compilación.   t   p   : Sobrescribiendo  el  método  hashCode()   / El  hashCode  es  un  identificador,  el  cual,  no  es  único.  Este  se  utiliza  para  aumentar  la  velocidad  de  búsqueda  en  grandes  colecciones   / de  datos,  de  manera  que  la  búsqueda  se  resuma  a  todos  aquellos  que  tengan  el  mismo  hashing.   v Para  el  examen  solo  es  necesario  saber  el  funcionamiento  de  este  método  y  que  sea  una  implementación  válida,  sin  importar  si  es  o   a no  eficiente.   l Un  código  hash  dentro  de  una  tabla  señala  solamente  un  grupo,  luego,  dentro  de  ese  grupo,  hay  que  buscar  el  objeto.   o r Dado  que  el  hash  solo  marca  el  grupo  contenedor,  y  luego  hay  que  rastrear  el  objeto  dentro  de  ese  grupo,   c es  necesario  que  se  implemente  el  método  equals().   r e   a Dado  que  el  hash  se  utiliza  para  almacenar  y  para  obtener,  es  una  condición  básica  de  que  siempre  devuelva  el  mismo  código  para  el   mismo  objeto.   t En   términos   de   código   hashing,   lo   más   performante   sería   tener   un   algoritmo   que   genere   un   código   hashing   distribuido   i uniformemente  para  todos  los  objetos,  aunque  también  es  válido  tener  un  hasing  que  siempre  devuelva  el  mismo  número  (cumple   v con  la  regla  de  el  mismo  hashing  para  el  mismo  objeto).   o Contratos  a  cumplir   . b Hashcode   l El  mismo  objeto  debe  devolver  siempre  el  mismo  hash.   o Si   según   equals()   dos   objetos   son   iguales,   la   llamada   a   hashcode   para   cada   uno   debe   devolver   el   mismo   valor   g (obj1.hashcode()  ==  obj2.hashcode()).   s Si  según  equals()  dos  objetos  son  diferentes,  la  llamada  a  hashcode  para  cada  uno  puede  llegar  a  devolver  el  mismo  valor,   p pero  no  es  obligatorio.   o Equals   t . Si  a  equals  se  le  pasa  el  mismo  objeto  que  el  que  invoca  el  método,  el  resultado  debe  ser  siempre  true  (obj1.equals(obj1)).   c Si   la   llamada   de   equals   entre   dos   objetos   devuelve   true,   los   operandos   pueden   ser   invertidos(obj1.equals(obj2)   ==   obj2.equals(obj1)).   o Si  se  compara  cualquier  objeto  con  null,  este  debe  devolver  false  (  obj1.equals(null)  siempre  debe  ser  false).   m   Colecciones   Es  posible  confundirse  en  el  examen  con  las  distintas  palabras  collection   collection  (todo  en  minúsculas)   Nombre  para  identificar  cualquier  estructura  que  contenga  una   colección  de  elementos,  y  permita  iterar  a  través  de  ellos.   Collection  (con  C  mayúscula)   Interface  java.util.Collection.   Collections   (con   C   mayúscula   y   s   Clase  java.util.Collections.   al  final)        
  • 6. Java  World    Capítulo  7   6   class Domain Model   h Serializable Comparable<File> Obj ect t t File InputStream p FileInputStream : / Writer Reader Obj ectInputStream / g u OutputStream s BufferedWriter OutputStreamWriter InputStreamReader BufferedReader t a FileOutputStream Obj ectOutputStream v PrintWriter FileWriter FileReader o   a Características  de  cada  clase   l Una  colección  puede  clasificarse  de  la  siguiente  manera:   b e Colección   r o l Distribución   Orden            (sorted)   (order)   a . b Distribuida   No  distribuida   Ordenada   Desordenada   l   o Cada  colección  va  a  tener  un  atributo  de  Distribución  y  otro  de  Orden.   g Distribución:   Indica  la  forma  en  que  los  elementos  son  almacenados  en  base  a  las  reglas  de  ordenamiento.   s o Distribuido   Los  elementos  son  ordenados  según  un  conjunto  de  reglas.   p o No  distribuido     Los  elementos  no  se  ordenan  de  manera  definida.   o Orden:   Indica  la  forma  en  que  los  elementos  son  accedidos.   t o Ordenado   Se  itera  en  los  elementos  de  una  forma  definida.   . o Desordenado   Se  itera  en  los  elementos  de  una  forma  que  pareciera  casi  aleatorea.   c List  <<interface>>   o m   Todas   las   listas   manejan   sus   colecciones  mediante  índices.   <<interface>>   <<interface>>   Permiten   agregar   un   elemento   List   Queue   dentro   de   la   colección   en   un   índice   específico,   obtener   un   elemento   de   la   colección   según   el   índice,   y   buscar   en   que   posición   se   encuentra   un   objeto   ArrayList   Vector   LinkedList   en  particular.    
  • 7. 7   Java  World    Capítulo  7     ArrayList   Funciona   como   un   array   que   puede   modificar   su   tamaño   dinámicamente.   Permite   acceder   aleatoriamente   a   sus   h elementos.   t Vector   Se  comporta  exactamente  igual  que  el  ArrayList,  con  la  salvedad  de  que  es  Thread-­‐Safe  (multihilo  seguro).   t LinkedList   Mantiene  un  índice  aparte,  de  manera  que  se  puede  utilizar  como  una  cola,  o  como  un  simple  ArrayList.   p Añade  métodos  como  agregar  al  comienzo  o  al  final.   : Set  <<interface>>   / Los   sets   solo   manejan   objetos   únicos,   impidiendo   su   / duplicidad  dentro  de  la  colección.   <<interface>>   v Para   saber   si   un   objeto   ya   se   encuentra   agregado   en   la   Set   a colección,   es   necesario   que   se   implemente   el   método   l equals().   <<interface>>   HashSet     ShortedSet   o   r   c   LinkedHashSet   <<interface>>   r NavigableSet   e a t TreeSet   i HashSet   Los  códigos  se  almacenan  sin  un  orden  definido,  utilizando  como  identificador  su  código  de  hash.   v LinkedHashSet   Se   comporta   como   HashSet   con   la   salvedad   de   que   esta   mantiene   otro   índice,   el   cual   almacena   el   orden   de   los   o elementos  según  fueron  siendo  insertados  en  la  colección.   TreeSet   a  colección  requieren   . implementar  Comparable  o  Comparator.   b Map  <<interface>>   l o Los   maps   corresponden   con   la   funcionalidad   de   los   sets,   con   la   <<interface>>   g Map   diferencia   de   que   los   maps   no   s tienen  restricciones  en  cuanto  a  la   p duplicidad  de  sus  elementos.   Hashtable   HashMap   <<interface>>   o Al  igual  que  los  sets,  requiere  que   ShortedMap   t se   implemente   equals()   y   . hashCode().   c   <<interface>>   LinkedHashMap     NavigableMap   o   m     TreeMap   HashMap   Los  códigos  se  almacenan  sin  un  orden  definido,  utilizando  como  identificador  su  código  de  hash.   Hashtable   Se  comporta  como  HashMap,  con  la  salvedad  de  que  es  Thread-­‐Safe  (multihilo  seguro).   LinkedHashMap   Se  comporta  como  HashMap  con  la  salvedad  de  que  esta  mantiene  otro  índice,  el  cual  almacena  el  orden  de  los   elementos  según  fueron  siendo  insertados  en  la  colección.   TreeMap   bjetos   almacenados   en   esta   colección   requieren  implementar  Comparable  o  Comparator.          
  • 8. Java  World    Capítulo  7   8     Queue  <<interface>>   h t comportamiento   puede   variar,   pero   se   comportan   por   <<interface>>   <<interface>>   t defecto  como  una  cola  o  FIFO,  First-­‐In    First-­‐Out  (Primero   List   Queue   p en  entrar    primero  en  salir).   :   /   LinkedList   Ver  interface  List.   / LinkedList   PriorityQueue   PriorityQueue   Es  una  lista  por  defecto  FIFO  con  prioridad.   g Requiere   la   implementación   de   u Comparable.   s Resumen  de  las  clases  de  collection   t Clase   Map   Set   List   Queue   Distribución  (order)   Orden  (sorted)   a HashMap   X         No   No   v Hashtable   X         No   No   o TreeMap   X         Por  orden   Por   orden   natural   o   reglas   de   a (sorted)   comparación.   l LinkedHashMap   X         Por   orden   de   inserción   o   último   No   b acceso.   HashSet     X       No   No   e TreeSet     X       Por  orden   Por   orden   natural   o   reglas   de   r (sorted)   comparación.   o LinkedHashSet     X       Por  orden  de  inserción   No   l ArrayList       X     Por  índice   No   a Verctor       X     Por  índice   No   . LinkedList       X   X   Por  índice   No   b PriorityQueue         X   Por  orden   Por  orden  de  prioridades.   (sorted)   l o g ArrayList   s p java.util.ArrayList.  Representa  un  array  que  puede  modificar  su  tamaño  dinámicamente.   Ventajas:   o t Puede  crecer  dinámicamente   . Provee  mecanismos  de  inserción  y  búsqueda  más  potentes  que  los  de  un  Array.   c Ahora  que  conoces  las  interfaces  de  las  colecciones,  lo  mejor  es  utilizarlas.  Veamos  como  instanciar  un  ArrayList.   o m   import  java.util.List;;   import  java.util.ArrayList;;   //...  código   List  myArray  =  new  ArrayList();;   //O  también  podemos  hacer  uso  de  genéricos   List<String>  myArray  =  new  ArrayList<String>();;     No  te  preocupes  por  los  genéricos,  ya  los  veremos  en  detalle  más  adelante.        
  • 9. 9   Java  World    Capítulo  7     Autoboxing  con  colecciones   h t Las  colecciones  solo  pueden  majera  objetos,  no  primitivas.  En  versiones  previas  a   Java   5,  si  queríamos  agregar  una   primitiva  a  un   t Array  la  teníamos  que  codificar  manualmente  dentro  de  su  respectivo  Wrapper.  A  partir  de  Java  5,  de  esto  se  encarga  el  autoboxing.   p : //Antes  de  Java  5   miArrayList.add(new  Integer(15));;   /   / //A  partir  de  Java  5   miArrayList.add(15);;   v   a Ordenando  colecciones   l   o Los  métodos  que  veremos  a  continuación,  solo  se  encuentran  disponibles  para  las  colecciones  List.   r c   r e import  java.util.ArrayList;;   import  java.util.Collections;;   a import  java.util.List;;   t public  class  PruebasCollections_001  {   i    static  public  void  main(String[]  args)  {          List<String>  myArray  =  new  ArrayList<String>();;   v        myArray.add("JavaWorld");;   o        myArray.add("Gustavo  Alberola");;          myArray.add("Leonardo  Blanco");;   .        myArray.add("Matias  Alvarez");;   b        //Mostramos  el  array  sin  orden          System.out.println("Desordenado:  "  +  myArray.toString());;   l        //El  ordenamiento  se  realiza  con  la  clase  Collections   o        Collections.sort(myArray);;   g        //Mostramos  el  array  ordenado          System.out.println("Ordenado      :  "  +  myArray.toString());;   s    }   p }   o     Como  puedes  observar,  el  ordenamiento  se  realizó  con  el  método  estático  sort  de  la  clase  java.util.Collections.   t . Desordenado:  [JavaWorld,  Gustavo  Alberola,  Leonardo  Blanco,  Matias   c Alvarez]   Ordenado      :  [Gustavo  Alberola,  JavaWorld,  Leonardo  Blanco,  Matias   o Alvarez]     m     Pero,   si   intentamos   hacer   este   ejercicio   con   elementos   dentro   del   ArrayList   que   no   sean   ni   Strings   ni   Wrappers   de   primitivas,   obtendremos  un  error.   La  interfaz  comparable   Si  queremos  hacer  que  nuestras  propias  clases  se  puedan  ordenar,  deberemos  de  implementar  dicha  interfaz  y  definir  el  método   compareTo.   La  firma  de  este  método  es  int  compareTo(Object).   El  valor  devuelto  debe  ser:   Negativo   Si  this  <  Object   0     Si  this  ==  Object   Positivo     Si  this  >  Object   El  método  sort  utilizará  el  método  compareTo  para  ordenar  el  array.    
  • 10. Java  World    Capítulo  7   10     Existen  dos  maneras  de  declarar  el  método,  mediante  genéricos  y  mediante  la  notación  antigua.   h //Utilizando  genéricos   t class  ImplementaGenerico  implements  Comparable<ImplementaGenerico>  {   t    //...  código      public  int  comparteTo(ImplementaGenerico  obj)  {   p        //...  código   :    }   }   /   / //Utilizando  notación  antigua   g class  ImplementaGenerico  implements  Comparable  {      //...  código   u    public  int  compareTo(Object  obj)  {   s        if  (obj  instanceof  ImplementaGenerico)  {              ImplementaGenerico  tmpObj  =  (ImplementaGenerico)  obj;;   t            //...  código   a        }      }   v }   o   Utilizando  genéricos,  automáticamente  podemos  especificar  como  parámetro  el  mismo  tipo  de  la  clase,  en  cambio,  bajo  la  notación   a antigua,  debemos  castear  el  objeto  recibido  a  dicho  tipo.   l La  interfaz  comparator   b e Bien,  vimos  la  interfaz  Comparable,  pero,  ¿que  pasaría  si  quisiéramos  ordenar  una  Clase  que  no  podemos  modificar,  u  ordenar  en   r más  de  una  forma  diferente?   Comparator  al  rescate!     o Si  vemos  el  método  sort,  podemos  encontrar  una  sobrecarga  que  recibe  como  segundo  parámetro  un  Comparator.   l Veamos  cómo  crear  uno.   a . import  java.util.List;;   b import  java.util.ArrayList;;   import  java.util.Collections;;   l import  java.util.Comparator;;   o   g public  class  PruebasCollections_002  {      private  String  nombre;;   s    private  String  apellido;;   p    public  PruebasCollections_002(String  nombre,  String  apellido)  {          this.nombre  =  nombre;;   o        this.apellido  =  apellido;;   t    }      public  String  getNombre()  {  return  nombre;;  }   .    public  String  getApellido()  {  return  apellido;;  }   c    public  String  toString()  {  return  nombre  +  "  "  +  apellido;;  }   o          static  public  void  main(String[]  args)  {   m          List  myArray  =  new  ArrayList();;          myArray.add(new  PruebasCollections_002("Gustavo",  "Alberola"));;          myArray.add(new  PruebasCollections_002("Matias",  "Alvarez"));;          myArray.add(new  PruebasCollections_002("Leonardo",  "Blanco"));;          myArray.add(new  PruebasCollections_002("Java",  "World"));;          //Mostramos  la  coleccion  tal  cual  está  ahora          System.out.println("Desordenada                    :  "  +  myArray.toString());;          //Ordenamos  por  nombre          Collections.sort(myArray,  new  ComparatorByNombre());;          System.out.println("Ordenada  por  nombre    :  "  +  myArray.toString());;                
  • 11. 11   Java  World    Capítulo  7     h        //Ordenamos  por  apellido   t        Collections.sort(myArray,  new  ComparatorByApellido());;          System.out.println("Ordenada  por  apellido:  "  +  myArray.toString());;   t    }   p }   :   class  ComparatorByNombre  implements  Comparator<PruebasCollections_002>  {   /    public  int  compare(PruebasCollections_002  obj1,  PruebasCollections_002  obj2)  {   /        return  obj1.getNombre().compareTo(obj2.getNombre());;      }   v }   a   class  ComparatorByApellido  implements  Comparator  {   l    public  int  compare(Object  obj1,  Object  obj2)  {   o        if  (obj1  instanceof  PruebasCollections_002  &&  obj2  instanceof   r PruebasCollections_002)  {              return   c ((PruebasCollections_002)obj1).getApellido().compareTo(((PruebasCollections_002)obj2). r getApellido());;          }  else  {   e            return  -­1;;   a        }      }   t }   i     v o class  ComparatorByNombre  implements  Comparator<PruebasCollections_002>  {   .    public  int  compare(PruebasCollections_002  obj1,  PruebasCollections_002  obj2)  {          return  obj1.getNombre().compareTo(obj2.getNombre());;   b    }   l }     o class  ComparatorByApellido  implements  Comparator  {   g    public  int  compare(Object  obj1,  Object  obj2)  {   s        if  (obj1  instanceof  PruebasCollections_002  &&  obj2  instanceof   PruebasCollections_002)  {   p            return   o ((PruebasCollections_002)obj1).getApellido().compareTo(((PruebasCollections_002)obj2). getApellido());;   t        }  else  {   .            return  -­1;;          }   c    }   o }   m       Desordenada                    :  [Gustavo  Alberola,  Matias  Alvarez,  Leonardo   Blanco,  Java  World]   Ordenada  por  nombre    :  [Gustavo  Alberola,  Java  World,  Leonardo  Blanco,   Matias  Alvarez]   Ordenada  por  apellido:  [Gustavo  Alberola,  Matias  Alvarez,  Leonardo   Blanco,  Java  World]              
  • 12. Java  World    Capítulo  7   12     Comparable  vs  Comparator   h Ya  vimos  ambas  interfaces,  entonces,  ¿Cuándo  utilizar  una  o  la  otra?   t Cuando   solo   queramos   definir   un   método   de   ordenamiento   en   una   clase   cuyo   código   fuente   podemos   acceder   y   modificar,   t utilizamos  Comparable.   p Cunado   queremos   implementar   varios   métodos   de   ordenamiento,   u   ordenar   una   clase   cuyo   código   no   tenemos   o   no   podemos   : modificar,  utilizamos  Comparator.   / Ordenando  con  la  clase  Arrays   / Las  firmas  de  los  métodos  son  iguales  que  Collections:  sort(Object)  y  sort(Object,  Comparator).  El  problema  radica  en  que  un  Array,  a   g diferencia  de  un  List,  puede  contener  elementos  de  tipo  primitivo.  ¿y,  cual  es  el  problema  entonces?   u Simple,  veamos  la  firma  de  Comparator:   s public  int  compare(Object  obj1,  Object  obj2)   t ¿Sigues   sin   verlo?   Bueno,   aquí   va   una   pista:   Object.   Este   solo   recibe   objetos,   no   primitivas.   A   menos   que   se   almacenen   en   sus   a respectivos  Wrappers,  podemos  utilizar  las  sobrecargas  de  sort(Xx)  que  existen  para  cada  primitivo.   v o Recuerda,   sort(Xx)   esta   sobrecargado   para   todos   los   tipos   de   primitivas,   siendo   Xx   el   tipo,   pero   cuando   a utilizas  un  Comparator  sort(Object,  Comparator)  no  puedes  jamás  utilizar  un  array  con  primitivas.   l   b e Búsqueda  en  Arrays  y  Collections   r Ambas  clases  permiter  realizar  búsquedas  dentro  de  colecciones.  Para  ello,  necesitamos  conocer  las  siguientes  reglas:   o l Las  búsquedas  son  realizadas  utilizando  el  método  binarySearch().   Las  búsquedas  exitosas  devuelven  un  int  con  el  índice  donde  se  encuentra  el  objeto.   a Si  la  búsqueda  no  encuentra  el  valor,  devuelve  un  valor  negativo.   . La  colección  o  array  sobre  la  cual  buscar,  debe  de  haber  sido  previamente  ordenada.   b Si  no  cumples  con  el  paso  anterior,  el  resultado  puede  ser  impredecible.   l Si  la  colección  o  array  se  encuentra  en  un  orden  natural,  la  búsqueda  se  debe  realizar  en  un  orden  natural.   o Si  la  colección  o  array  fue  ordenada  con  un  Comparator,  se  debe  utilizar  el  mismo  Comparator  para  realizar  la  búsqueda,   g pasándolo  como  segundo  argumento  al  método  binarySearch().   s Veamos  un  ejemplo:   p o import  java.util.Comparator;;   t import  java.util.Arrays;;     . public  class  PruebasCollections_003  {   c    static  public  void  main(String[]  args)  {          String[]  myArray  =  {"uno",  "dos",  "tres",  "cuatro"};;   o        for(String  s  :  myArray)  {   m              System.out.print(s  +  "  ");;          }          System.out.println();;          System.out.println("Posicion  de  "tres":  "  +  Arrays.binarySearch(myArray,   "dos"));;          NuevoOrdenamiento  ordenador  =  new  NuevoOrdenamiento();;          Arrays.sort(myArray,  ordenador);;          for(String  s  :  myArray)  {              System.out.print(s  +  "  ");;          }      
  • 13. 13   Java  World    Capítulo  7     h        System.out.println();;   t        System.out.println("Posicion  de  "tres":  "  +  Arrays.binarySearch(myArray,   "dos"));;   t        System.out.println("Posicion  de  "tres":  "  +  Arrays.binarySearch(myArray,  "dos",   p ordenador));;           :    }   }   /   / class  NuevoOrdenamiento  implements  Comparator<String>  {      public  int  compare(String  obj1,  String  obj2)  {   v        return  obj2.compareTo(obj1);;   a    }   }   l o   r uno  dos  tres  cuatro   c Posicion  de  "tres":  1   r uno  tres  dos  cuatro   Posicion  de  "tres":  -­1   e Posicion  de  "tres":  2   a     t Dado  que  en  la  segunda  búsqueda  (luego  del  nuevo  ordenamiento),  no  utilizamos  el  mismo  Comparator  para  la  búsqueda,  nos  dio   i como  resultado  -­‐1  (resultado  inesperado),  luego,  cuando  utilizamos  el  mismo  Comparator,  la  búsqueda  resultó  exitosa.   v o Recuerda,  antes  de  buscar  en  una  colección,  esta  debe  de  haber  sido  previamente  ordenada,  y  la  búsqueda   . debe  realizarse  en  el  mismo  orden.   b l   o Conversion  de  Arrays  a  Lists  a  Arrays   g Para  pasar  de  Array  a  List,  tenemos  el  método  Arrays.asList().  La  firma  del  método  es:   s   p Algo   muy   importante   para   recordar.   Si   se   le   pasa   un   array,   generará   un   List   cuyos   elementos   apuntan   a   la   misma   dirección   de   o memoria  que  los  elementos  del  Array,  de  manera  que  si  modificamos  los  valores  en  uno,  se  verán  reflejados  en  el  otro.   t Para  pasar  de  List  a  Array,  tenemos  el  método  toArray().  Este  puede  generar  un  array  de  objetos,  o  se  le  puede  pasar  un  array  de  un   . tipo  determinado.   c import  java.util.Arrays;;   o import  java.util.Collections;;   m   import  java.util.List;;   import  java.util.ArrayList;;   public  class  PruebasCollections_004  {      static  public  void  main(String[]  args)  {          Integer[]  myArrayDeInts  =  {  1,  3,  12,  5,  47};;          List  myListDeInts  =  Arrays.asList(myArrayDeInts);;                    System.out.println(myListDeInts.size());;          System.out.println(myListDeInts);;          myListDeInts.set(4,  456);;          for(int  a  :  myArrayDeInts)  {              System.out.print(a  +  "  ");;          }          System.out.println();;                
  • 14. Java  World    Capítulo  7   14            Object[]  myArrayDeObjects  =  myListDeInts.toArray();;   h        Integer[]  myArrayDeIntegers  =  new  Integer[5];;   t        myListDeInts.toArray(myArrayDeIntegers);;             t        myArrayDeIntegers[2]  =  555;;   p          for(int  a  :  myArrayDeInts)  {   :            System.out.print(a  +  "  ");;   /        }   /        System.out.println();;             g        for(int  a  :  myArrayDeIntegers)  {   u            System.out.print(a  +  "  ");;          }   s    }   t }   a     v o 5   [1,  3,  12,  5,  47]   a 1  3  12  5  456   l 1  3  12  5  456   1  3  555  5  456   b   e   r Si   intentas   convertir   un   array   de   primitivas   en   un   List,   no   generaras   un   error,   pero   no   se   generará   o correctamente   el   List.   El   intentar   acceder   luego   a   alguno   de   sus   elementos   puede   lanzar   un   l ArrayIndexOutOfBoundsException.   a     . b l o g s p o t . c o m    
  • 15. 15   Java  World    Capítulo  7     Utilizando  los  Lists   h t Lo  más  común  para  iterar  a  través  de  los  elementos  de  un  List  es  un  iterador  (también  se  puede  utilizar  un  simple  for-­‐each,  pero  con   t un  iterador  es  menos  acoplamiento).   El  iterador  posee  dos  métodos  simples:   p : boolean  hasNext()   Indica  si  aun  quedan  más  elementos.  No  nos  desplaza  de  la  posición  acutal  dentro  del  array.   / Object  next()     Obtiene  el  elemento  actual,  y  desplaza  a  la  siguiente  posición  del  array.   / A  partir  de  Java  5,  los  iteradores  también  soportan  genéricos.  Veamos  un  ejemplo:   v a import  java.util.List;;   l import  java.util.Iterator;;   import  java.util.ArrayList;;   o   r public  class  PruebasCollections_005  {   c    static  public  void  main(String[]  args)  {          List<String>  myLista  =  new  ArrayList();;   r        myLista.add("JavaWorld");;   e        myLista.add("Dragon  Ball");;          myLista.add("Pampita");;   a        Iterator<String>  it  =  myLista.iterator();;   t        while  (it.hasNext())  {              String  s  =  it.next();;   i            System.out.print(s  +  "  ");;   v        }   o        System.out.println();;             .        Iterator  it2  =  myLista.iterator();;   b        while  (it2.hasNext())  {              String  s  =  (String)it2.next();;   l            System.out.print(s  +  "  ");;   o        }      }   g }   s     p o JavaWorld  Dragon  Ball  Pampita   t JavaWorld  Dragon  Ball  Pampita   .   c   o Como  podrán  apreciar,  cuando  utilizamos  el  iterador  con  genéricos,  no  hubo  que  castear  el  tipo  de  dato,  ya  que  automáticamente  se   obtiene  el  String.  En  el  segundo  caso,  es  necesario  realizar  el  casteo  explícitamente.   m        
  • 16. Java  World    Capítulo  7   16     Utilizando  los  Sets   h Recordemos  que  los  sets  almacenan  objetos  únicos  (no  existen  dos  elementos  que  respondan  a  x.equals(y)  ==  true).   t En  los  Sets,  los  métodos  add  devuelven  un  valor  de  tipo  boolean,  que  indica  si  el  valor  fue  o  no  agregado  a  la  colección.   t Veamos  un  ejemplo:   p : import  java.util.Set;;   / import  java.util.HashSet;;   import  java.util.TreeSet;;   /   g public  class  PruebasCollections_006  {      static  public  void  main(String[]  args)  {   u        boolean[]  resultados  =  new  boolean[4];;   s        Set  mySet  =  new  HashSet();;   t        resultados[0]  =  mySet.add(new  Integer(45));;          resultados[1]  =  mySet.add("b");;   a        resultados[2]  =  mySet.add(new  Object());;   v        resultados[3]  =  mySet.add(45);;  //Se  produce  un  autoboxing             o        System.out.println("Resultados  para  el  HashSet");;   a        for(boolean  res  :  resultados)  {              System.out.println(res);;   l        }   b           e                  mySet  =  new  TreeSet();;   r        resultados[0]  =  mySet.add("a");;   o        resultados[1]  =  mySet.add("b");;          resultados[2]  =  mySet.add("a");;   l        resultados[3]  =  mySet.add("c");;   a           .        System.out.println("Resultados  para  el  TreeSet");;          for(boolean  res  :  resultados)  {   b            System.out.println(res);;   l        }             o        mySet.add(new  Integer(45));;  //Al  llegar  a  esta  línea  se  produce  una  excepción.   g    }   }   s   p o Consola   Resultados  para  el  HashSet   t true   . true   true   c false   o Resultados  para  el  TreeSet   true   m   true   false   true   Exception  in  thread  "main"  java.lang.ClassCastException:   java.lang.String  cannot  be  cast  to  java.lang.Integer      at  java.lang.Integer.compareTo(Unknown  Source)      at  java.util.TreeMap.put(Unknown  Source)      at  java.util.TreeSet.add(Unknown  Source)      at  PruebasCollections_006.main(PruebasCollections_006.java:XX)          
  • 17. 17   Java  World    Capítulo  7     h   t Dado   que   un   Tree   (árbol)   tiene   por   defecto   ordenamiento   natural,   los   elementos   deben   de   poder   t compararse  entre  sí.   p   : / Utilizando  los  Maps   / Los  maps  se  manejan  almacenando  pares  clave/valor.  Veamos  un  poco  más  a  fondo  como  funciona  un  Map  para  inserción  y  para   v obtención  de  datos.   a Veamos  un  ejemplo  en  código:   l o import  java.util.Map;;   import  java.util.HashMap;;   r   c public  class  PruebasCollections_007  {      static  public  void  main(String[]  args)  {   r        Map<Object,  Object>  myMap  =  new  HashMap<Object,  Object>();;   e        Persona  p1  =  new  Persona(45);;   a        Persona  p2  =  new  Persona(30);;          Animal  a1  =  new  Animal(30);;   t           i        myMap.put(p1,  "Clave  persona1");;          myMap.put(p2,  "Clave  persona2");;   v        myMap.put(a1,  "Clave  animal1");;   o                  System.out.println("1  -­  "  +  myMap.get(new  Persona(45)));;   .        System.out.println("2  -­  "  +  myMap.get(new  Persona(30)));;   b        System.out.println("3  -­  "  +  myMap.get(a1));;   l        System.out.println("4  -­  "  +  myMap.get(new  Animal(30)));;          System.out.println("Cant:"  +  myMap.size());;   o    }   g }     s class  Persona  {   p    private  int  edad;;      public  int  getEdad(){  return  edad;;  }   o    public  Persona(int  edad){  this.edad  =  edad;;  }   t    public  boolean  equals(Object  persona)  {   .        if  (persona  instanceof  Persona  &&  edad  ==  ((Persona)persona).getEdad())  {              return  true;;   c        }  else  {   o            return  false;;          }   m      }      public  int  hashCode(){  return  edad;;  }   }     class  Animal  {      int  edad;;      public  int  getEdad(){  return  edad;;  }      public  Animal(int  edad){  this.edad  =  edad;;  }   }                      
  • 18. Java  World    Capítulo  7   18     h 1  -­  Clave  persona1   2  -­  Clave  persona2   t 3  -­  Clave  animal1   t 4  -­  null   Cant:3   p   :     / Ok,  si  estas  dentro  de  este  grupo,  veamos  como  funcionan  las  colecciones  Map.   /   g Insersión:   u Se  ingresa  el  par  clave/valor   s De  la  clave  se  obtiene  el  int  del  hashCode.   t Se  almacena  el  valor  en  un  grupo  identificado  por  el  hashCode  del  paso  anterior.   a v Obtención:   o Se  especifica  la  clave   a De  esta  se  obtiene  el  hashCode  y  se  busca  el  grupo   l Si  el  hashCode  existe,  se  comparan  mediante  equals  las  claves.   b Si  son  equivalentes,  se  devuelve  el  valor   e En   el   caso   de   Animal,   contiene   tanto   el   método   HashCode   como   equals   redefinido,   de   manera   que   al   crear   una   nueva   clase,   se   r puede  encontrar  la  clave.   o Cuando   utilizamos   la   misma   instancia   de   Animal   (a1),   esta   primero   genera   el   mismo   HashCode   (utilizando   el   hash   por   defecto,   l generando  algo  como  Animal@44532),  y  luego  utiliza  el  equals.  Dado  que  este  último  no  esta  sobrescrito,  lo  que  hace  es  verificar  las   a posiciones  de  memoria.  Dado  que  es  la  misma  instancia  (esta  apuntando  al  mismo  objeto),  el  resultado  es  true.   . Pero  cuando  creamos  un  nuevo  objeto  de  tipo  Animal,  por  más  que  este  tenga  las  mismas  características,  al  no  haber  sobrescrito  los   métodos  equals  y  hashCode,  jamás  podremos  obtener  dicho  valor,  y  el  mismo  quedará  perdido  dentro  del  HashMap.   b Es  muy  común  ver  ejemplos  en  los  que  como  clave  utilizan  Strings,  bien,  recuerda  que  tanto  los  Strings  como  los  Wrappers  de  los   l tipos  primitivos  sobrescriben  equals  y  hashCode,  de  manera  que  es  posible  utilizarlos  como  clave.   o     g s p o t . c o m