简单组合java.util.Map<K,V>实现Map<K,P,V>
java.util.Map<K,V>为单键对单值,有时需要双键对单值,因此基于Map<K,V>可以简单实现一个Map<K,P,V>。
接口定义:
package cc.lixiaohui.demo.javassist.proxy.util; import java.util.Collection; import java.util.Set; /** * 两个键的复合map * <pre> * key------+ * |-->value * param----+ * <pre> * * @author lixiaohui * @date 2016年10月1日 上午10:58:40 * */ public interface CompoundKeyMap<K, P, V> { V get(K key, P param); V get(K key, P param, V defValue); V put(K key, P param, V value); V putIfAbsent(K key, P param, V value); Set<java.util.Map.Entry<CompoundKey<K, P>, V>> entrySet(); Set<CompoundKey<K, P>> keys(); Collection<V> values(); int size(); boolean isEmpty(); public interface CompoundKey<K, P> { K getKey(); P getParam(); } }
基于HashMap的简单实现,关键在于CompoundKey的hashcode和equals方法的重写:
package cc.lixiaohui.demo.javassist.proxy.util; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Set; /** * 基于{@link java.util.HashMap}的CompoundKeyMap的实现. * * @author lixiaohui * @date 2016年10月1日 下午12:37:08 * */ public class CompoundKeyHashMap<K, P, V> implements CompoundKeyMap<K, P, V> { private Map<CompoundKey<K, P>, V> map = new HashMap<CompoundKey<K, P>, V>(); public V get(K key, P param) { key = Objects.requireNonNull(key, "key cannot be null"); param = Objects.requireNonNull(param, "param cannot be null"); return map.get(newKey(key, param)); } private CompoundKeyMap.CompoundKey<K, P> newKey(K key, P param) { return new CompoundKeyImpl<K, P>(key, param); } public V get(K key, P param, V defValue) { key = Objects.requireNonNull(key, "key cannot be null"); param = Objects.requireNonNull(param, "param cannot be null"); V value = get(key, param); return value == null ? defValue : value; } public V put(K key, P param, V value) { return map.put(newKey(key, param), value); } public V putIfAbsent(K key, P param, V value) { return map.putIfAbsent(newKey(key, param), value); } public Set<Entry<CompoundKeyMap.CompoundKey<K, P>, V>> entrySet() { return map.entrySet(); } public Set<CompoundKeyMap.CompoundKey<K, P>> keys() { return map.keySet(); } public Collection<V> values() { return map.values(); } public int size() { return map.size(); } public boolean isEmpty() { return map.isEmpty(); } static class CompoundKeyImpl<K, P> implements CompoundKey<K, P> { private K key; private P param; CompoundKeyImpl(K key, P param) { super(); this.key = key; this.param = param; } public K getKey() { return key; } public P getParam() { return param; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((key == null) ? 0 : key.hashCode()); result = prime * result + ((param == null) ? 0 : param.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; CompoundKeyImpl<?, ?> other = (CompoundKeyImpl<?, ?>) obj; if (key == null) { if (other.key != null) return false; } else if (!key.equals(other.key)) return false; if (param == null) { if (other.param != null) return false; } else if (!param.equals(other.param)) return false; return true; } } }
相关推荐
在Java中,java.util.stream.Collectors.toMap()方法是一个非常实用的工具,它允许我们将流(Stream)中的元素收集到一个Map中。这个方法是Collectors类中的一个静态方法,它实现了Collector接口,用于在流的终止...
java.util.HashMap<K,V> (implements java.lang.Cloneable, java.util.Map<K,V>, java.io.Serializable) java.util.LinkedHashMap<K,V> (implements java.util.Map<K,V>) org.springframework.core.annotation....
然而,SharedPreference本身并不直接支持复杂数据类型如`List<Map<String, List<String>>>`的存储。在实际操作中,我们需要通过序列化和反序列化的方式来处理这类数据。 **序列化**是将复杂数据结构转换成可以存储...
List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>(); for (AnnouncementBean announcementBean : listAnnouncementBean) { Map<String, Object> map = new HashMap<String, Object>(); ...
<p th:text="${hello}">dddd</p> </body> </html> --------------------------- 直接访问静态页面 --------------------------- http://localhost:8080/index.html 可直接访问到 src/main/resources/...
这是我在编写struts2中遇到的问题,整理出来,包括截图,希望可以帮到大家
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
Map<String, Object> map = new HashMap<>(); for (String key : jsonObject.keySet()) { map.put(key, jsonObject.get(key)); } String jsonArrayString = "[{\"key\":\"value\"}]"; JSONArray jsonArray = ...
可将List<Bean>导出成Excel,或读取Excel成List<Bean>、Map<String,Object>,很方便,可配置日期格式,可识别数字,经过企业级测试有效. <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</...
1. 集合框架:Java.util包是Java集合框架的基础,包括List、Set、Queue和Map等接口,以及ArrayList、LinkedList、HashSet、HashMap等实现类。这些集合类为存储和操作对象提供了灵活的方式。例如,ArrayList实现了...
Java.util包是Java标准库中的核心包之一,它包含了大量用于日常编程的工具类和接口。这个包在Java 2版本中得到了显著增强,引入了许多重要的数据结构和算法,为Java程序员提供了更丰富的功能。 首先,Java.util包中...
本篇文章将详细介绍如何将`java.util.Date`对象转换为符合特定格式的JSON字符串,从而实现更加标准化的数据交换。 #### 一、问题背景与目标 在Java中,`java.util.Date`类用于表示具体的时间点,它包含了毫秒级别...
java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
ExcelUtil 将这些代码段添加到您的pom.xml ... < artifactId>excel-util</ artifactId> < version>master</ version> </ dependency> ... 示例-Excel文件 示例-ModelEntity @ExcelEntity public cla
Map<String, Serializable> cacheData = new HashMap<>(); cacheData.put("key", "value"); memcachedServiceImpl.setCache("testKey", cacheData); // 从Memcached获取数据 Map<String, Serializable> data =...
List<Map<String, Object>> userMaps = dataMapper.fetchDatabaseData("SELECT * FROM users"); for (Map<String, Object> userMap : userMaps) { String username = (String) userMap.get("username"); int age =...
boolean delete(java.lang.String sql, java.util.Map<java.lang.Integer,java.lang.Object> elements) 根据传入的参数删除单条记录的方法 boolean delete(java.lang.String sql, java.lang.Object[] elements)...