2012-04-21 22 views
16

¿Es bueno usar HashMap en lugar de utilizar la clase de objeto ...... Usando Hashmap ....clase de objeto vs Hashmap

Map<String, String> cellMap = new HashMap<String, String>(); 
int j = 0; 
while (cellIter.hasNext()) 
{ 
    HSSFCell myCell = (HSSFCell) cellIter.next(); 
    cellMap.put(columnMap[j], myCell.toString()); 
    j++; 
} 

Y el uso de clase de objeto .....

ABC abc= new ABC(); 
abc.setA(myRow.getCell(0).toString()); 
abc.setB(myRow.getCell(1).toString()); 
abc.setC(myRow.getCell(2).toString()); 

por favor dime en el contexto de la salud de solicitud, requisitos de memoria, etc ...

+1

En realidad estoy leyendo un archivo xls que contendrá lakhs de registros mi jefe me ha pedido que actualice el oráculo leyendo datos del archivo xls ** ONE BY ONE ** solo usando getters y setters de la clase de objeto en lugar de usar un hashmap en el cual mapear todos los datos y luego pasarlo a Oracle. – abhi

+2

Para no indios, 1 lakh = 100K :-) –

+0

Si usa un HashMap, ¿cómo obtiene el "tipo" del valor cuando lo almacena en Oracle? (suponiendo que su hoja de cálculo contiene valores de varios tipos, como cadena, valores numéricos, etc.) – Ushox

Respuesta

25

Esto depende mucho de lo que se intenta lograr: para mayor flexibilidad, el mapa hash es mejor. Pero la flexibilidad tiene un precio: el mapa hash también es más grande y más lento que una clase con el mismo número de campos fuertemente tipados.

  • mapa hash tiene mayor capacidad de memoria de una clase con idéntico número de campos
  • mapa hash fuerzas de boxeo en las primitivas
  • mapa hash es más lenta para crear y acceso

También hay una impacto en la legibilidad: cuando su lógica de negocios es específica de una clase con un número fijo de campos, una clase de propósito especial claramente gana; cuando los campos están configurados dinámicamente, la tabla hash es su única opción. También podría tener un diseño híbrido, cuando un objeto utiliza un mapa hash para su almacenamiento interno, presenta campos muy bien nombrados externamente y expone la semántica para agregar más "campos" a medida que avanza.

En resumen, antes de decidirse por un mapa hash por su flexibilidad, debe decidir si realmente necesita toda esa flexibilidad en su diseño. A veces, la respuesta es "sí", y algunas veces es "no"; no existe una solución de "talla única" para esto.

3

Usted debe ver esto como un problema de "diseño" antes de la función. No es necesario realizar una optimización prematura por adelantado a favor de un buen diseño. Entonces, la pregunta es: "¿necesita pasar por una colección intermediaria para llenar su objeto de dominio ABC?" En la mayoría de los casos no lo haría, pero es difícil decir un definitivo sí o un definitivo sin sin conocer el contexto general.

ACTUALIZACIÓN: 30-40k: Número de registros es irrelevante para el objeto HashMap vs comparación porque van a ser manejados de manera cíclica (disclaimer: irrelevante en términos de diseño no en términos de rendimiento). Sin embargo, el número de columnas en su hoja de cálculo es importante, ya que esto se reflejará directamente como el número de atributos en su objeto.

Si esto es sólo una migración de datos o de transferencia de datos ejercicio, entonces me gustaría ir con el enfoque HashMap. Suponiendo que ABC será un objeto contenedor de datos de corta duración y sin uso, no es necesario crearlo. Luego probaría el rendimiento del sistema y, si no cumple los criterios de aceptación, lo perfilaría y lo optimizaría solo si fuera necesario.

+1

Hmm ... Si la pregunta es "¿Debería usar un atributo HashMap en lugar de atributos A, B y C en mi objeto de dominio, NO lo haría? use un HashMap. A, B, C son los atributos de su objeto, no deberían ser meramente almacenados en un HashMap. – Ushox

+0

En realidad es como leer y configurar los datos usando hashmap o una clase ... y luego recuperarlos de él. .... – abhi

+0

Actualizado mi publicación – Ushox

4

Un objeto tiene campos (datos) y métodos (comportamiento). Si sus datos consisten en un conjunto fijo de celdas (A, B y C), entonces definitivamente use un objeto.

Java es un objeto OO, y el diseño OO, la encapsulación, etc. están ahí para ayudarlo a crear programas robustos, fáciles de mantener y rápidos.

Un mapa es útil cuando debe asociar un número variable de claves y valores. Pero es simplemente una estructura de datos, y no le permite encapsular comportamiento adicional.

Por ejemplo, puede tener un método getAAndB() en su objeto que devuelve A concatenado con B. O puede tener métodos para transformar o consultar los campos. O podría pasar las instancias de ABC a otros objetos que hagan uso de ellas. Usar un objeto ABD con métodos bien definidos es mucho más fácil que usar un Map<String, String>. ¿Cuáles son las claves del mapa? ¿Cuáles son sus valores? ¿Dónde está documentado? ¿Qué pasa si quieres cambiar las llaves? ¿Cómo detectará todos los lugares en el código donde se usan estas claves?

+0

He reparado los datos para leer con un número fijo de columnas en la posición fija ..... Las claves para cada valor también se fija como se puede ee estoy pasando un conjunto de cadenas fijas como la clave en el hashmap ... y no quiero cambiar las claves .... Sé dónde voy a estar usando estas claves ... las cosas son si falla cualquiera de las cosas anteriores Simplemente, CORRE UN ERROR – abhi

+1

Luego use un objeto. Si no está seguro de la validez del archivo de Excel, valídelo antes o mientras lo lee y crea instancias de sus objetos (compruebe que las celdas obligatorias estén ocupadas, por ejemplo). Pero (suponiendo que las celdas representen campos de personas), es mucho más legible tratar con objetos Person que tienen un primer nombre, un segundo nombre y un apellido que tratar con un Map . –

+1

Lo tengo Parece que Object sería la opción preferida para recorrer ... – abhi