获取LinkedHashMap中的头部元素(最早添加的元素):时间复杂度O(1)
public <K, V> Entry<K, V> getHead(LinkedHashMap<K, V> map) { return map.entrySet().iterator().next(); }
获取LinkedHashMap中的末尾元素(最近添加的元素):时间复杂度O(n)
public <K, V> Entry<K, V> getTail(LinkedHashMap<K, V> map) { Iterator<Entry<K, V>> iterator = map.entrySet().iterator(); Entry<K, V> tail = null; while (iterator.hasNext()) { tail = iterator.next(); } return tail; }
通过反射获取LinkedHashMap中的末尾元素:时间复杂度O(1),访问tail属性
public <K, V> Entry<K, V> getTailByReflection(LinkedHashMap<K, V> map) throws NoSuchFieldException, IllegalAccessException { Field tail = map.getClass().getDeclaredField("tail"); tail.setAccessible(true); return (Entry<K, V>) tail.get(map); }
测试代码
import static org.junit.Assert.assertEquals; import java.lang.reflect.Field; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map.Entry; import org.junit.Before; import org.junit.Test; public class TestLinkedHashMap { private LinkedHashMap<String, Integer> map = new LinkedHashMap<>(); private String letters[] = { "a", "b", "c", "d", "e" }; @Before public void init() { for (int i = 0; i < letters.length; i++) { map.put(letters[i], i + 1); } } @Test public void testGetHead() { assertEquals(getHead(map).getKey(), "a"); assertEquals(getHead(map).getValue(), Integer.valueOf(1)); } @Test public void testGetTail() { assertEquals(getTail(map).getKey(), "e"); assertEquals(getTail(map).getValue(), Integer.valueOf(5)); } @Test public void testGetTailByReflection() throws NoSuchFieldException, IllegalAccessException { assertEquals(getTailByReflection(map).getKey(), "e"); assertEquals(getTailByReflection(map).getValue(), Integer.valueOf(5)); } public <K, V> Entry<K, V> getHead(LinkedHashMap<K, V> map) { return map.entrySet().iterator().next(); } public <K, V> Entry<K, V> getTail(LinkedHashMap<K, V> map) { Iterator<Entry<K, V>> iterator = map.entrySet().iterator(); Entry<K, V> tail = null; while (iterator.hasNext()) { tail = iterator.next(); } return tail; } @SuppressWarnings("unchecked") public <K, V> Entry<K, V> getTailByReflection(LinkedHashMap<K, V> map) throws NoSuchFieldException, IllegalAccessException { Field tail = map.getClass().getDeclaredField("tail"); tail.setAccessible(true); return (Entry<K, V>) tail.get(map); } }