如何让自定义TreeMap子类Table的entrySet返回Set<Table.Entry>?
解决方案
要实现Table.entrySet()返回Set<Table.Entry>且不复制元素,核心是通过迭代器包装的方式,将原TreeMap返回的Map.Entry动态适配为Table.Entry,而非一次性复制所有元素。以下是具体实现步骤:
1. 定义内部Entry接口与包装类
先在Table类中定义继承自Map.Entry<String, Integer>的内部接口,同时实现一个轻量包装类,将原Map.Entry转换为Table.Entry类型:
public class Table extends TreeMap<String, Integer> { // 对外暴露的Entry接口,仅作为类型标记 public interface Entry extends Map.Entry<String, Integer> {} // 私有静态包装类,委托原Map.Entry的所有操作 private static class EntryWrapper implements Entry { private final Map.Entry<String, Integer> originalEntry; EntryWrapper(Map.Entry<String, Integer> originalEntry) { this.originalEntry = originalEntry; } @Override public String getKey() { return originalEntry.getKey(); } @Override public Integer getValue() { return originalEntry.getValue(); } @Override public Integer setValue(Integer value) { return originalEntry.setValue(value); } @Override public boolean equals(Object o) { return originalEntry.equals(o); } @Override public int hashCode() { return originalEntry.hashCode(); } }
2. 重写entrySet()方法,返回自定义Set实现
创建一个复用原TreeMap.entrySet()逻辑的自定义Set,仅在迭代时动态包装元素:
@Override public Set<Entry> entrySet() { return new EntrySet(super.entrySet()); } // 自定义Set,复用原集合的核心逻辑,仅包装迭代器 private class EntrySet extends AbstractSet<Entry> { private final Set<Map.Entry<String, Integer>> originalSet; EntrySet(Set<Map.Entry<String, Integer>> originalSet) { this.originalSet = originalSet; } @Override public Iterator<Entry> iterator() { return new Iterator<>() { private final Iterator<Map.Entry<String, Integer>> originalIterator = originalSet.iterator(); @Override public boolean hasNext() { return originalIterator.hasNext(); } @Override public Entry next() { return new EntryWrapper(originalIterator.next()); } @Override public void remove() { originalIterator.remove(); } }; } @Override public int size() { return originalSet.size(); } @Override public boolean contains(Object o) { if (o instanceof Entry) { return originalSet.contains(((EntryWrapper) o).originalEntry); } return originalSet.contains(o); } @Override public void clear() { originalSet.clear(); } } // 其他业务方法... }
实现说明
- 无额外性能开销:所有操作都直接委托给原
TreeMap的entry,仅在迭代时做一层轻量包装,没有元素复制或集合重建的成本。 - 完全隐藏继承关系:对外暴露的
Set<Table.Entry>与底层TreeMap实现完全隔离,调用者无法通过返回值知晓Table的继承细节。 - 行为一致性:自定义Set的
size()、contains()、clear()等方法均复用原集合逻辑,保证与TreeMap的行为完全一致。
内容的提问来源于stack exchange,提问作者deltamind106
相关产品推荐
相关产品推荐

