public static void main(String[] args) {
Stack<Integer> stack = new MyStackLinkedList();
processing(stack);
Stack<Integer> stack2 = new MyStackArrayList();
processing(stack);
}
//метод не знает, какая именно реализация используется, но ему достаточно знать об add и pop
public static void processing(Stack<Integer> stack) {
stack.add(1);
stack.add(15);
stack.pop();
}
多态的本质是在一些接口的背后,可以隐藏实现细节。
比如我们要创建一个栈,它的简化界面是这样的:
可以提供哪些实现?事实上,它们有很多,你可以使用
ArrayList
,你可以使用一个数组,例如,我们知道最大大小。您可能想使用LinkedList
. 但是,问一个问题,在使用栈的时候,需要知道这个接口背后是怎样的实现吗?很可能不是,你只知道有方法add
和pop
,但你并不关心元素在内存中的位置。您只是在使用堆栈。同样在这种情况下
Map.Entry<K, V>
,具体的实现是隐藏的,突然明白HashMap
以后怎么优化,为了所有产品的向后兼容,我们改或者写一个新的实现就够了Node
,但是剩下的代码会不必改变。EntrySet 是 Map 的值(即 key-value)。每个键值对都是一个条目。一般来说,什么是映射 - 它是一个关联数组,其中(特别是在 HashMap 的实现中)通过键的哈希搜索值。如果发生冲突并且键的哈希码匹配,则将此哈希的值添加到单链表中(最多 8 个元素,然后它会变成一棵红黑树,但不会发生这种情况散列函数定义,加上加载因子部分地防止了这种情况,有很多小东西,我们现在将省略它们)但正如我们所见,Set 和 Map 是不同的集合,但不是概念上的。事实上,Set 在后台使用 Map - 我们的关联数组,只是它保留 null 作为值。这就是为什么,
但总而言之,Set 只是在底层使用了 Map(请注意,与 set 不同,map 不实现可迭代,但 map 的 getValues() 和 getKeys() 方法可以)