Páginas

Mostrando entradas con la etiqueta Concepto. Mostrar todas las entradas
Mostrando entradas con la etiqueta Concepto. Mostrar todas las entradas

11/8/16

Que es un HashSet y cómo funciona

Que es un HashSet y cómo funciona.

Que es un HashSet y cómo funciona.




Siguiendo un poco con la temática de la Collection framework, este es un topic muy interesante, como ya sabemos hay varias interfaces en este framework, el HashSet es una de las implementaciones de la
SetForma parte de la Collection framework y básicamente lo que quiere decir es que en un Set solo puede existir un objeto, no pueden haber objetos repetidos.
interface. Para crear un HashSet solo tenemos que hacerlo de esta manera:
     // Un HashSet simple de String
  HashSet<String> hashSet = new HashSet<String>();
   
Simple no, bueno detrás de ese código, si vamos un poco más allá podemos ver que el código de ese constructor es así:
 public HashSet() {
        map = new HashMap<>();
    }
 
 //Donde "map" esta declarado asi
 HashMap<E,Object> map;
   
Aquí ya vemos que algo está un poco extraño, sorpresa, como es que un HashSet que implementa la interface Set en su implementación tiene un HashMap que implementa la interface Map?? Bueno algo muy sencillo, como les venía diciendo al principio del articulo un HashSet no permite objetos repetidos y los ingenieros de Java para asegurarse de que no pudiéramos ingresar objetos repetidos decidió utilizar un HashMap internamente el cual tampoco permite objetos repetidos, por que lo hicieron así?? Porque pueden, es algo confuso, pero funciona muy bien y reutilizan el código.

Deberías leer: Que es un HashMap y como funciona.

Una vez creado el HashSet, vamos a comentar un poco sus métodos mas importantes, supongamos que queremos agregar un conjuntos de personas al HashSet, lo hacemos así:
  hashSet.add("Pedro");
  hashSet.add("Pepe");
  hashSet.add("Luis");
  
  System.out.println("HashSet= " + hashSet);
    
Si corremos el ejemplo veremos la salida en la consola:
  HashSet= [Pedro, Pepe, Luis]
    
Si analizamos el método add(), vemos que este es su código:
  public boolean add(E e) {
   return map.put(e, PRESENT)==null;
  }
  
  // Donde "PRESENT" es 
  Object PRESENT = new Object();
    
Este método devuelve un boolean, si el objeto se agrega al HashSet devuelve true si no false, como ya sabemos, internamente esto funciona como un HashMap, cuando agregamos un objeto en un HashMap si ese objeto ya está agregado devuelve el valor anterior de esa key pero si el objeto no está y se agrega al HashMap devuelve null, entonces lo que hace el método add() es evaluar que devuelve y así se sabe si agrega o no el objeto. Podemos utilizar el boolean que devuelve el método para ejecutar algún código, por ejemplo:
  boolean b = hashSet.add("Luis");
  if(b){
   // Se agrego correctamente 
   
   // code
  
  }else{
   // Ya esta en el HashSet
   
   // code
  }
    
Como ya "Luis" está en el HashSet el metodo add() devuelve false y podríamos hacer algo en ese caso.
Si necesitamos eliminar un objeto del HashSet lo hacemos así:
  hashSet.remove("Luis");
  
  // Codigo del metodo remove()
  public boolean remove(Object o) {
   return map.remove(o)==PRESENT;
  }
    
La misma teoría del método add().
Como obtener un objeto del HashSet? Si estás acostumbrado a utilizar ArrayList, HashMap, Arrays puedes asumir que también se puede obtener un determinado objeto de un HashSet y no es así, el HashSet no posee un método para obtener un determinado objeto. Según mi punto de vista esto no es que este mal porque puedes resolverlo de varias maneras, en realidad no es necesario un metodo get(), de la manera más sencilla desde mi punto de vista sería así:
  if(hashSet.contains("Pepe")){
   // Se supone que si esta el objeto y podriamos sustituir el metodo get()
   
   // code
  }
    
Preguntando si un determinado objeto está en el HashSet podríamos sustituir el método get() ya que asumiríamos que el objeto si esta. También podemos iterar el HashSet de esta manera:
     for (Iterator<String> iterator = hashSet.iterator(); iterator.hasNext();) {
         String nombre = iterator.next();
         if (nombre.equals("Pedro")){
          // code
         }
     }
    
Esta manera también es válida pero gasta más recursos en comparación con el método contains(). Otra manera puede ser pasando el HashSet a un ArrayList:
     ArrayList<String> arrayList = new ArrayList<String>(hashSet);
     String nombre = arrayList.get(2);
    
También es válida pero sigo quedándome con la primera opción.
Caracteristicas del HashSet:
  • Solo almacena objetos.
  • No permite objetos duplicados.
  • Solo permite un objeto null
  • Implementa la Set interface.
  • No garantiza ningún tipo de orden al insertar los objetos.
  • Es un wrapper de HashMap.
Ese es básicamente el funcionamiento del HashSet, tienes que ver dependiendo de la necesidad que componente utilizar, ya eso queda de tu parte pero te recomiendo que utilices HashSet si no quieres almacenar objetos repetidos, si eso no importa deberías utilizar HashMap ya que el HashSet es solo un
wrapperUna clase wrapper es una clase que encapsula tipos de datos, de modo que esos tipos de datos pueden utilizarte para crear instancias en otra clase que necesita los mismos, en este caso HashSet utiliza internamente HashMap.
de HashMap. Recuerda comentar si necesitas que agregue algo más a esta entrada o si tienes alguna duda.

Suerte!!

4/8/16

Diferencia entre HashMap y Hashtable Java.

Diferencia entre HashMap y Hashtable en Java.

Diferencia entre HashMap y Hashtable en Java




Seguimos con preguntas de entrevistas, hay que recordar que la oportunidad que estás buscando puede que sea la entrevista que tienes mañana, lo que quiere decir que probablemente estas preparándote y quieres que todo salga bien, pero una pregunta tan sencilla como esta puede dejarte de lado si no sabes responderla con la seguridad de que sabes que lo que dices es cierto.
Estas dos estructuras de datos son muy similares, pero también tienen algunas diferencias muy notables, haciendo una breve introducción, los dos son estructuras de datos muy usados en el Collection framework.

Te puede interesar: Que es un HashMap y como funciona.

Diferencias:
  • El HashMap solo permite un null key y cualquier cantidad de null values, en cambio un Hashtable no permite ningún null ya sea en key o en value.

14/8/15

Diferencia entre override vs overload

Diferencia entre override vs overload

Diferencia entre override vs overload, como implementarlos.




Cuando estamos comenzando a programar en Java tendemos a confundirnos con muchos conceptos ya que algunos son muy parecidos, en este caso vamos hacer una breve explicación para ver cuáles son las diferencias entre override y overload, estos conceptos son súper importantes en la programación orientada a objetos, se utilizan mucho y son una buena práctica de programación.
Para comenzar vamos hablar acerca de sus conceptos, cuando nos referimos a override en Java, estamos hablando de la sobrescritura de un método, para sobrescribir un método en Java tenemos que tener una ClaseHija que herede mínimo un método de una ClasePadre, la necesidad de sobrescribir un método se presenta ya que el hecho de que una ClaseHija herede de una ClasePadre no quiere decir que tienen que hacer lo mismo, para entender mejor, el hecho de que un padre tenga la responsabilidad de trabajar en una empresa no quiere decir que el hijo tenga que trabajar en la misma empresa.
Para aplicar esto en Java necesitamos hacerlo así:
ClasePadre
public class ClasePadre {

 public String quienSoy() {
  return "Soy la clase padre";
 }

}
   
ClaseHija
public class ClaseHija extends ClasePadre {
 
 @Override
 public String quienSoy() {
  return "Soy la clase hija";
 }
   
Como vemos la ClaseHija tiene el mismo método que la ClasePadre con la anotación @Override, lo que nos indica que es un método que no puede cambiar al de la ClasePadre, ni más ni menos parámetros, ya que solo lo estamos sobrescribiendo.

Ahora bien, cuando hablamos de overload en Java, nos referimos a sobrecargar un método, esto lo aplicamos en los constructores de las clases ya que hay veces que necesitamos más de un constructor, y al momento de implementarlo lo que hacemos es ponerle el mismo nombre que los demás pero con distintos parámetros, también es una buena práctica de programación utilizarlo para métodos que en realidad hacen lo mismo, por ejemplo:
Tenemos un método que busca clientes en nuestra base de datos, ese método solo busca clientes por sexo pero necesitamos otro método que aparte de buscar clientes por sexo también sea por edad, y en si los métodos lo que hacen es buscar clientes, así que le ponemos el mismo nombre pero con distintos parámetros, para implementarlo solo necesitamos este bloque de código:
Constructores:
public class Persona {
 public String quienSoy() {
  return "Soy una persona";
 }

 public String quienSoy(String nombre) {
  return "Soy " + nombre;
 }

 public String quienSoy(String nombre, String apellido) {
  return "Soy " + nombre + " " + apellido;
 }
}
  
Metodos:
 public void buscarCliente(String Sexo) {
  // Implementacion
 }

 public void buscarCliente(String Sexo, int edad) {
  // Implementacion
 }

 public void buscarCliente(String Sexo, int edad, String empresa) {
  // Implementacion
 }
  
Como vemos estamos sobrecargando el constructor de la clase Persona, todo esto es muy fácil, poco a poco ve integrándolo en tus aplicaciones, no hay lugar para confusiones ya que los dos conceptos overload y override se aplican de distintas formas y no olvides la mayor diferencia entre los dos conceptos es que no hacen lo mismo, uno sobrescribe un metodo y el otro sobrecarga un metodo, este tema está muy ligado al Polimorfismo en Java, otro de los grandes pilares de la programación orientada a objetos.
Si te ayudo la entrada no olvides compartir el conocimiento aprendido y si tienes alguna sugerencia puedes comentar, suerte!!

11/8/15

Polimorfismo Java

Polimorfismo Java.

Polimorfismo Java, que es el polimorfismo y sus tipos.




El Polimorfismo es uno de los conceptos generales que van de la mano con la programación orientada a objetos OOP, en si el polimorfismo en Java se refiere a las distintas formas que puede tener una variable, objeto o método creado.
Hay dos tipos establecidos de polimorfismo:
  • El polimorfismo en tiempo de ejecución (runtime) o dinámico, que lo podemos implementar con la sobre escritura (overriding) de métodos.
  • El polimorfismo en tiempo de compilación (compile time) o estático, que lo podemos implementar en la sobrecarga (overloading) de métodos
Te puede interesar: Diferencias entre override y overload.

Hay una confusión entre algunas programadores a la hora de aceptar que la sobrecarga de métodos también es un Polimorfismo, básicamente si nos fijamos en el concepto se podría afirmar que si, ya que el mismo método puede tomar distintas formas dependiendo de los parámetros recibidos, como ya aclaramos un poco lo que es la teoría vamos aplicar los dos tipos de Polimorfismo en la práctica.

Polimorfismo en tiempo de ejecución (runtime), es el más usado y se podría implementar con dos clases hijas que hereden de una clase padre. Este es el diagrama de clases del ejemplo:
Polimorfismo Java
Polimorfismo Java