studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones java hashmap lookup containskey

java - para - manual de programacion android pdf



Java se resume sin el valor? (6)

Digamos que quiero poner palabras en una estructura de datos y quiero tener búsquedas de tiempo constante para ver si la palabra está en esta estructura de datos. Todo lo que quiero hacer es ver si la palabra existe. ¿Utilizaría un HashMap (containsKey ()) para esto? HashMap usa combinaciones de clave-> valor, pero en mi caso no tengo un valor. Por supuesto, podría usar null para el valor, pero incluso null toma espacio. Parece que debería haber una mejor estructura de datos para esta aplicación.

La colección podría ser utilizada por varios hilos, pero dado que los objetos contenidos en la colección no cambiarían, no creo que tenga un requisito de sincronización / concurrencia.

¿Puede alguien ayudarme?


Aparte de Set s, en algunas circunstancias es posible que desee convertir un Map en un Set con Collections.newSetFromMap(Map<E,Boolean>) (algunos Map s no permiten valores null , por lo tanto, el Boolean ).



Por lo general, utilizarías una implementación de Set y, por lo general, HashSet. Si necesitó acceso simultáneo, ConcurrentHashSet proporciona un reemplazo directo que brinda acceso concurrente y seguro, incluida la iteración segura en el conjunto.

En cualquier caso, recomendaría referirse a él simplemente como un conjunto en todo su código, excepto en el único lugar donde lo construye; de esta forma, es más fácil incluir una implementación para la otra si más tarde lo requiere.

Incluso si el conjunto es de solo lectura , si lo usa un hilo que no sea el que lo crea, debe pensar en una publicación segura (es decir, asegurarse de que cualquier otro hilo vea el conjunto en un estado consistente: recuerde cualquier escritura de memoria, incluso en constructores, no está garantizada para estar disponible para otros hilos cuando o en el modo que espere, a menos que tome medidas para garantizar esto). Esto puede hacerse por los siguientes:

  • asegurándose de que la (s) única (s) referencia (s) para el conjunto estén en los campos finales ;
  • asegurándose de que realmente es cierto que ningún hilo modifica el conjunto.

Puede ayudar a garantizar esto último utilizando el contenedor Collections.unmodifiableSet (). Esto le da una vista inmodificable del conjunto dado, por lo que siempre que no haya otra referencia "normal" al conjunto de escapes, está a salvo.


Probablemente quiera usar un java.util.Set . Las implementaciones incluyen java.util.HashSet , que es el conjunto equivalente de HashMap.

Incluso si los objetos contenidos en la colección no cambian, es posible que deba hacer la sincronización. ¿Es necesario agregar objetos nuevos al conjunto después de pasar el conjunto a un hilo diferente? Si es así, puede usar Collections.synchronizedSet () para hacer que el conjunto sea seguro para subprocesos.

Si tiene un Mapa con valores y tiene algún código que solo quiere tratar el Mapa como un Conjunto, puede usar Map.entrySet () (aunque tenga en cuenta que entrySet devuelve una vista de Conjunto de las claves en el Mapa; si el mapa es mutable, el mapa se puede cambiar a través del conjunto devuelto por entrySet).


Use HashSet en su lugar. Es una implementación hash de Set , que se usa principalmente para describir exactamente lo que describes (un conjunto de elementos desordenados).


como todo el mundo dijo que HashSet es probablemente la solución más simple, pero no tendrá una búsqueda de tiempo constante en un HashSet (porque las entradas pueden estar encadenadas) y almacenará un objeto ficticio (siempre el mismo) para cada entrada ...

Para obtener información aquí una lista de estructuras de datos tal vez encuentre una que se ajuste mejor a sus necesidades.