tengo un código que crea una lista, que se inicia con el tamaño de un mapa:¿Puede un mapa Java devolver un tamaño de -1?
private Set<String> mKeys = new HashSet<String>(64);
....
List<String> keyList = new ArrayList<String>(mKeys.size());
que estoy viendo una excepción: java.lang.IllegalArgumentException: Capacidad ilegal: -1
Puede un mapa devuelve un tamaño de -1? Estoy mirando el código fuente para HashSet, que está respaldado por un HashMap. El código fuente de HashMap muestra las partes internas donde elementCount siempre se disminuye en una llamada a removeEntry(). Además, los métodos para HashMap.empty() responden en elementCount siendo == 0, que devolvería false si elementCount era -1.
¿Alguien ha topado con esto antes? Puedo codificarlo, pero se siente como un truco, lo que me hace pensar que estoy haciendo algo mal con el código actual.
EDITAR: Estaba tratando de simplificar el problema originalmente. El conjunto que estoy usando se define realmente como
private static Set<String> mKeys = Collections.synchronizedSet(new HashSet<String>(64));
EDITAR: La clave aquí puede estar en synchronizedSet. Desde el JavaDoc:
Es imperativo que el usuario sincronizar manualmente en el conjunto devuelto cuando se itera sobre ella:
Set s = Collections.synchronizedSet(new HashSet()); ... synchronized(s) { Iterator i = s.iterator(); // Must be in the synchronized block while (i.hasNext()) foo(i.next()); }
no seguir este consejo podría obtener un comportamiento no determinista.
Comportamiento no determinista para mí podría incluir un tamaño de -1. Necesito volver atrás y asegurarme de que sincronizo correctamente al iterar sobre el conjunto, pero sospecho que este es el problema.
A menos que estés poner algo en 'mKeys' en ese código se omite, se está cometiendo un error de todos modos : 'mKeys.size()' devuelve la cantidad de elementos en 'Set', no la cantidad de cubos. No es el "tamaño" de la estructura de datos, sino la cantidad de elementos que contiene. – Borealid
¿Es posible que esté corrompiendo el mapa al acceder desde múltiples hilos sin sincronización? – finnw
El código se simplifica de lo que estoy haciendo en realidad, ya que hay algo de sincronización. Actualizaré la pregunta con información más específica. Estoy casi seguro de que esto no es un problema con el ajuste en Integer.MAX_VALUE. – mmorrisson