Páginas

Mostrando entradas con la etiqueta POO. Mostrar todas las entradas
Mostrando entradas con la etiqueta POO. 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!!

21/7/14

Debug en Eclipse / JBoss Developer Studio.

Java debug. Depurar En Eclipse/JBoss Developer Studio

Como Depurar (debug) aplicación Java con Eclipse/JBoss Developer Studio.




Depurar aplicacion Java con Eclipse/JBoss Developer Studio. Lo mejor que podemos hacer cuando estamos desarrollando una aplicación, y surge un error a la hora de compilar la misma, es depurarla. Muchas personas hacen la depuración escribiendo interminables System.out.println(), lo cual nos hace perder tiempo y no es efectivo, para depurar tu aplicación de una manera correcta la mayoría de los IDE's (por no decir todos), cuentan con una herramienta para la depuración del código, si te preguntas para qué sirve la depuración de una aplicación, aquí te explico, cuando vamos haciendo un bloque de código muchas veces surgen errores al momento de compilar, algunos errores son obvios y se pueden corregir rápidamente, pero otros errores no son tan obvios, lo que tenemos que hacer para descubrir que ocasiona el error es ir viendo que pasa en nuestro código en tiempo de ejecución, para ver los valores de todas nuestras variables, si se cumplen o no las condiciones, si la base de datos esta retornando lo que debería... Tenemos que depurarla ya que con simples System.out.println() no vamos a ver los errores y utilizando las excepciones es posible que alguna excepción no la estemos capturando y resolver este asunto de esta manera puede quitarnos valioso tiempo. Una vez claro el concepto de depurar una aplicación, podemos ver cómo funciona, en este caso yo trabajo con el IDE JBoss Developer Studio / eclipse y para ejecutar la depuración en nuestro código hay dos reglas principales:

  • Insertar un breakpoint: lo que hacemos es elegir una línea del código desde donde queremos comenzar hacer la depuración.
  • Ejecutar la aplicación en modo DEBUG: se abre una vista nueva en el IDE que nos muestra todos los datos acerca de nuestro código y así podemos ver porque hay un error.
Para realizar este ejemplo voy a utilizar una vieja aplicación de escritorio Java Swing que posee una base de datos PL/SQL, la aplicación sirve para controlar los alumnos y profesores de un determinado centro de estudios, vamos a insertar un Breakpoint en el método que me devuelve todos los profesores del centro de estudios y así veremos si el método funciona como de verdad queremos, en la vista de depuración nos vamos moviendo de línea en línea y el te va mostrando el valor de los atributos que hay en la línea.