//一个key是枚举类型的map,速度基本会比hashMap更快
//先看构造函数
//构造指定键类型的EnumMap
public EnumMap(Class<K> keyType) {
this.keyType = keyType;
//获取key的枚举值
keyUniverse = getKeyUniverse(keyType);
vals = new Object[keyUniverse.length];
}
public EnumMap(EnumMap<K, ? extends V> m) {
keyType = m.keyType;
keyUniverse = m.keyUniverse;
vals = m.vals.clone();
size = m.size;
}
public EnumMap(Map<K, ? extends V> m) {
if (m instanceof EnumMap) {
EnumMap<K, ? extends V> em = (EnumMap<K, ? extends V>) m;
keyType = em.keyType;
keyUniverse = em.keyUniverse;
vals = em.vals.clone();
size = em.size;
} else {
if (m.isEmpty())
throw new IllegalArgumentException("Specified map is empty");
//获取key的class类型
keyType = m.keySet().iterator().next().getDeclaringClass();
keyUniverse = getKeyUniverse(keyType);
vals = new Object[keyUniverse.length];
putAll(m);
}
}
//插入值
public V put(K key, V value) {
//验证key的class类型
typeCheck(key);
//获取枚举的位置
int index = key.ordinal();
Object oldValue = vals[index];
vals[index] = maskNull(value);
if (oldValue == null)
size++;
return unmaskNull(oldValue);
}
//判断key的class类型
private void typeCheck(K key) {
Class keyClass = key.getClass();
if (keyClass != keyType && keyClass.getSuperclass() != keyType)
throw new ClassCastException(keyClass + " != " + keyType);
}
//通过key获取值
public V get(Object key) {
return (isValidKey(key) ?
unmaskNull(vals[((Enum)key).ordinal()]) : null);
}
//校验key
private boolean isValidKey(Object key) {
if (key == null)
return false;
// Cheaper than instanceof Enum followed by getDeclaringClass
Class keyClass = key.getClass();
return keyClass == keyType || keyClass.getSuperclass() == keyType;
}
//根据key删除值
public V remove(Object key) {
if (!isValidKey(key))
return null;
int index = ((Enum)key).ordinal();
Object oldValue = vals[index];
vals[index] = null;
if (oldValue != null)
size--;
return unmaskNull(oldValue);
}
//删除映射
private boolean removeMapping(Object key, Object value) {
if (!isValidKey(key))
return false;
int index = ((Enum)key).ordinal();
if (maskNull(value).equals(vals[index])) {
vals[index] = null;
size--;
return true;
}
return false;
}
//返回集合长度
public int size() {
return size;
}
//是否包含某个key
public boolean containsKey(Object key) {
return isValidKey(key) && vals[((Enum)key).ordinal()] != null;
}
//是否包含某个值
public boolean containsValue(Object value) {
value = maskNull(value);
for (Object val : vals)
if (value.equals(val))
return true;
return false;
}
//清空
public void clear() {
Arrays.fill(vals, null);
size = 0;
}
//添加所有的
public void putAll(Map<? extends K, ? extends V> m) {
if (m instanceof EnumMap) {
EnumMap<? extends K, ? extends V> em =
(EnumMap<? extends K, ? extends V>)m;
if (em.keyType != keyType) {
if (em.isEmpty())
return;
throw new ClassCastException(em.keyType + " != " + keyType);
}
for (int i = 0; i < keyUniverse.length; i++) {
Object emValue = em.vals[i];
if (emValue != null) {
if (vals[i] == null)
size++;
vals[i] = emValue;
}
}
} else {
super.putAll(m);
}
}
分享到:
相关推荐
简单查询算法,供学习参考。 代码中描述了Enum和EnumMap类的使用。
EnumMap是Java中的一种特殊映射实现,它要求键必须来自枚举类型,并且对于每个可能的键值,都有预定义的条目。
16. **EnumSet和EnumMap**:针对枚举类型的特殊集合实现,效率较高。 17. **ConcurrentHashMap**:线程安全的哈希表,是高并发场景下的常用数据结构。 18. **CountDownLatch和CyclicBarrier**:同步原语,用于多...
【EnumMap和EnumSet详解】 在Java编程中,当我们需要处理特定枚举类型(Enum)作为键(Key)的映射关系时,EnumMap和EnumSet成为两种非常实用的工具类。它们是Java集合框架中专门为枚举类型设计的高效容器,提供了...
为了解决这些问题,Java提供了一个特定的Map实现——`java.util.EnumMap`,它专为枚举设计,提供更高的类型安全性和性能。 首先,让我们深入理解枚举和`ordinal()`方法。枚举类型定义了一系列相关的常量,例如`Herb...
JDK1.8为`EnumSet`和`EnumMap`增加了新的静态工厂方法,使得创建枚举集合更加方便。 十、动态类型语言支持 JDK1.8增加了对动态类型语言的支持,如GraalVM,使得Java可以更好地与其他动态语言交互。 以上只是JDK1.8...
这篇博客将深入探讨Java枚举的特性和使用方法,包括`EnumSet`和`EnumMap`这两个与枚举相关的数据结构。 首先,枚举定义的基本语法是`public enum EnumName {constant1, constant2, ...}`。每个枚举常量都是`...
本文总结了Effective Java 中关于枚举与注解的知识点,涵盖了枚举类型的优点、使用指南、避免使用 int 常量、使用 EnumSet 和 EnumMap 等。 枚举类型的优点 枚举类型提供了编译时类型安全、自动命名空间隔离、可以...
还有EnumSet和EnumMap,专门为枚举类型设计的高效集合实现。 在本次研讨会的实例代码中,你将看到如何创建、遍历、修改和操作这些集合的示例。这些代码涵盖了基本操作、性能测试、并发控制等方面,帮助你更好地理解...
同时,注解在枚举中也有应用,如EnumSet和EnumMap。 通过这个源码包,你可以跟随《Thinking in Java》第四版的章节,逐个探索和实践每一个主题,加深对Java编程的理解,提升编程技能。同时,这也是一个很好的自我...
6. **改进的枚举类型**:JDK7增强了枚举类型的功能,比如`java.util.EnumSet`和`java.util.EnumMap`的优化,提供了高效的集合操作。 7. **开关表达式**:虽然开关表达式(switch-on-string)在JDK7中并未完全实现,...
本示例将深入探讨Java中常用的`Map`实现,包括`HashMap`和`EnumMap`。 首先,`Map`接口定义了一些基本操作,如`put`用于添加键值对,`get`用于获取与给定键关联的值,`remove`用于移除键值对,以及`size`用于返回...
`通过key删除,`enumMap.erase(enumMap.begin(), enumMap.end());`清空整个map。 7. **swap操作** map的`swap()`函数并不交换容器内的元素,而是交换两个map容器的所有内容,即交换它们的内部结构和元素。例如: ...
《Collections源码解析:以Java实现的2D侧滚动资源收集游戏RockBottom》 在Java编程领域,理解并深入研究源代码是提升技术能力的重要途径。本文将针对标题中的"Collections源码java-RockBottom:2D侧滚动资源收集...
clear() 就相当于 `enumMap.erase(enumMap.begin(), enumMap.end());` Map 的其他操作 Map 还提供了许多其他的操作,例如反转 Map、合并两个 Map、将 Map 转换为其他容器等。这些操作可以根据实际情况选择使用。 ...
2. **枚举类型(Enum)的改进**:新增了`EnumSet`和`EnumMap`类,这两个类专门用于枚举类型的集合操作,提供了高效且类型安全的实现。 3. **NIO.2(New I/O 2)**:引入了`java.nio.file`包,提供了新的文件系统API...
如`enumMap.erase(it)`删除迭代器指向的元素,`enumMap.erase(key)`删除指定键的元素,`enumMap.erase(enumMap.begin(), enumMap.end())`清空整个`map`。 **示例代码** ```cpp #include #include #include ...
- `EnumSet`和`EnumMap`的性能得到提升,它们是专门为枚举类型设计的高效集合实现。 - `Collections`类新增了`unmodifiable*`工厂方法,用于创建不可修改的集合视图。 7. **语法糖**: - `_`作为下划线字符,...
enumMap.erase(enumMap.begin(), enumMap.end()); // 清空 map ``` #### 五、Map 的基本操作函数 1. **begin()**:返回指向 map 开始位置的迭代器。 2. **clear()**:删除所有元素。 3. **count()**:返回指定键...