LinkedHashMap
implementación actual (Java 8) realiza un seguimiento de su cola. Si el rendimiento es una preocupación y/o el mapa es de gran tamaño, puede acceder a ese campo a través de la reflexión.
Como la implementación puede cambiar, probablemente sea una buena idea tener una estrategia de respaldo también. Es posible que desee registrar algo si se lanza una excepción para que sepa que la implementación ha cambiado.
Podría verse como:
public static <K, V> Entry<K, V> getFirst(Map<K, V> map) {
if (map.isEmpty()) return null;
return map.entrySet().iterator().next();
}
public static <K, V> Entry<K, V> getLast(Map<K, V> map) {
try {
if (map instanceof LinkedHashMap) return getLastViaReflection(map);
} catch (Exception ignore) { }
return getLastByIterating(map);
}
private static <K, V> Entry<K, V> getLastByIterating(Map<K, V> map) {
Entry<K, V> last = null;
for (Entry<K, V> e : map.entrySet()) last = e;
return last;
}
private static <K, V> Entry<K, V> getLastViaReflection(Map<K, V> map) throws NoSuchFieldException, IllegalAccessException {
Field tail = map.getClass().getDeclaredField("tail");
tail.setAccessible(true);
return (Entry<K, V>) tail.get(map);
}
La situación es de hecho desafortunado. Aquí está la solicitud de función (de baja prioridad) que proporcionaría lo que necesita: http://bugs.sun.com/view_bug.do?bug_id=6266354 –