Map中相同的键Key不同的值Value实现原理

Map中相同的键Key对应不同的值Value通常出现在树形结构的数据处理中,通常的实现方法有JDK提供的IdentityHashMap和Spring提供的MultiValueMap。

public static void main(String[] args) {
	Map<String, Object> identity = new IdentityHashMap<>();
	identity.put("A", "A");
	identity.put("A", "B");
	identity.put("A", "C");

	Map<String, Object> identityString = new IdentityHashMap<>();
	identityString.put(String.join("A", ""), "B");
	identityString.put("A", "A");
	identityString.put(new String("A"), "C");

	MultiValueMap<String, Object> linked = new LinkedMultiValueMap<>();
	linked.add("A", "A");
	linked.add("A", "B");
	linked.add("A", "C");

	for (String key : identity.keySet()) {
		System.out.println("identity:" + identity.get(key));
	}

	for (String key : identityString.keySet()) {
		System.out.println("identity string:" + identityString.get(key));
	}

	for (String key : linked.keySet()) {
		System.out.println("linked:" + linked.get(key));
	}
}

实现原理

JDK提供的IdentityHashMap其底层是根据Key的hash码的不同+transient Object[] table来实现的;
Spring提供的LinkedMultiValueMap其底层是使用LinkedHashMap来实现的;
LinkedHashMap的底层是使用transient Entry head和transient Entry tail来实现的;
Entry是LinkedHashMap的内部类,其定义方式为:
static class Entry extends HashMap.Node { Entry before; Entry after; }

总结

IdentityHashMap和LinkedMultiValueMap的实现归根结底就是数组和链表的使用。
GitHub地址链接传送门

你可能感兴趣的:(Java技术进阶)