/** * Constructor for a given default size, optionally thread-safe. * * @param threadSafe if {@code true}, then a {@link ConcurrentHashMap} is used */ public State(int size, boolean threadSafe) { if (threadSafe) { map = new ConcurrentHashMap<String, Serializable>(initialCapacity(size)); } else { if (size > ARRAY_MAX) { map = new HashMap<>(initialCapacity(size)); } else { keys = new ArrayList<String>(size); values = new ArrayList<Serializable>(size); } } }
protected void putEvenIfNull(String key, Serializable value) { if (map != null) { map.put(key, value); } else { int i = keys.indexOf(key); if (i >= 0) { // existing key values.set(i, value); } else { // new key if (keys.size() < ARRAY_MAX) { keys.add(key); values.add(value); } else { // upgrade to a full HashMap map = new HashMap<>(initialCapacity(keys.size() + 1)); for (int j = 0; j < keys.size(); j++) { map.put(keys.get(j), values.get(j)); } map.put(key, value); keys = null; values = null; } } } }