介绍完了List
,我怕们继续来看commons-collections中为我们提供的Map
相关的实现类。
CaseInsensitiveMap
CaseInsensitiveMap
是一个对键的大小写不敏感的Map,在将键添加或与其它键比较之前,会将其转换为小写字符串。
使用示例:
package com.gujin.collections;
import org.apache.commons.collections.map.CaseInsensitiveMap;
import org.junit.Test;
public class CaseInsensitiveMapTest
{
@Test
public void test()
{
CaseInsensitiveMap caseInsensitiveMap = new CaseInsensitiveMap();
caseInsensitiveMap.put("name", "jianggujin");
caseInsensitiveMap.put("NAME", "jianggujin");
System.out.println(caseInsensitiveMap);
System.out.println(caseInsensitiveMap.get("nAme"));
}
}
运行结果:
{name=jianggujin}
jianggujin
CompositeMap
CompositeMap
修饰另一个Map。添加和移除操作使用可插拔的策略,如果没有提供策略,添加和删除是不支持的。
使用示例:
package com.gujin.collections;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.collections.map.CompositeMap;
import org.apache.commons.collections.map.CompositeMap.MapMutator;
import org.junit.Test;
public class CompositeMapTest
{
@Test
public void test()
{
CompositeMap compositeMap = new CompositeMap();
compositeMap.addComposited(new HashMap<String, String>());
MapMutator mapMutator1 = new MapMutator()
{
@Override
public void resolveCollision(CompositeMap composite, Map existing,
Map added, Collection intersect)
{
}
@Override
public void putAll(CompositeMap map, Map[] composited, Map mapToAdd)
{
}
@Override
public Object put(CompositeMap map, Map[] composited, Object key,
Object value)
{
return composited[0].put(key, value);
}
};
MapMutator mapMutator2 = new MapMutator()
{
@Override
public void resolveCollision(CompositeMap composite, Map existing,
Map added, Collection intersect)
{
}
@Override
public void putAll(CompositeMap map, Map[] composited, Map mapToAdd)
{
}
@Override
public Object put(CompositeMap map, Map[] composited, Object key,
Object value)
{
return composited[0].put(key.toString().toUpperCase(), value);
}
};
compositeMap.setMutator(mapMutator1);
compositeMap.put("name", "jianggujin");
compositeMap.setMutator(mapMutator2);
compositeMap.put("name", "JIANGGUJIN");
System.out.println(compositeMap.get("name"));
System.out.println(compositeMap.get("NAME"));
}
}
运行结果:
jianggujin
JIANGGUJIN
DefaultedMap
DefaultedMap
修饰另一个Map,当使用get
方法时,如果键不存在,将返回默认对象。
使用示例:
package com.gujin.collections;
import org.apache.commons.collections.map.DefaultedMap;
import org.junit.Test;
public class DefaultedMapTest
{
@Test
public void test()
{
DefaultedMap defaultedMap = new DefaultedMap("NULL");
defaultedMap.put("name", "jianggujin");
System.out.println(defaultedMap);
// 返回默认值
System.out.println(defaultedMap.get("NAME"));
}
}
运行结果:
{name=jianggujin}
NULL
FixedSizeMap
FixedSizeMap
修饰另一个Map防止添加/删除并且固定Map大小。仅允许对已有的键进行值的修改,影响到Map大小的操作都是不被支持的。
使用示例:
package com.gujin.collections;
import java.util.HashMap;
import org.apache.commons.collections.map.FixedSizeMap;
import org.junit.Test;
public class FixedSizeMapTest
{
@Test
public void test()
{
HashMap<String, String> src = new HashMap<String, String>();
src.put("name", "jianggujin");
FixedSizeMap fixedSizeMap = (FixedSizeMap) FixedSizeMap.decorate(src);
fixedSizeMap.put("name", "121");
// 不支持
//fixedSizeMap.put("name1", "121");
System.out.println(fixedSizeMap);
}
}
运行结果:
{name=121}
IdentityMap
IdentityMap
提供了一个Map的实现,与其他Map不同的是,在IdentityMap
中匹配键和值是通过==
而不是equals()
。
使用示例:
package com.gujin.collections;
import org.apache.commons.collections.map.IdentityMap;
import org.junit.Test;
public class IdentityMapTest
{
@Test
public void test()
{
IdentityMap identityMap = new IdentityMap();
String key1 = "name";
String key2 = new String("name");// key1 != key2
identityMap.put(key1, "jianggujin");
System.out.println(identityMap);
System.out.println(identityMap.get(key1));
System.out.println(identityMap.get(key2));
}
}
运行结果:
{name=jianggujin}
jianggujin
null
LazyMap
LazyMap
修饰另一个Map。当执行get()
方法时,如果键值不存在,则返回工厂创建的对象。
使用示例:
package com.gujin.collections;
import java.util.HashMap;
import org.apache.commons.collections.Factory;
import org.apache.commons.collections.map.LazyMap;
import org.junit.Test;
public class LazyMapTest
{
@Test
public void test()
{
Factory factory = new Factory()
{
@Override
public Object create()
{
return "NULL";
}
};
LazyMap lazyMap = (LazyMap) LazyMap.decorate(
new HashMap<String, String>(), factory);
lazyMap.put("name", "jianggujin");
System.out.println(lazyMap);
System.out.println(lazyMap.get("hello"));
}
}
运行结果:
{name=jianggujin}
NULL
LinkedMap
LinkedMap
实现了一个可维护顺序的Map,键的顺序为插入的顺序。
使用示例:
package com.gujin.collections;
import org.apache.commons.collections.map.LinkedMap;
import org.junit.Test;
public class LinkedMapTest
{
@Test
public void test()
{
LinkedMap linkedMap = new LinkedMap();
for (int i = 0; i < 10; i++)
{
linkedMap.put("key" + i, "value" + i);
}
System.out.println(linkedMap);
String key = "key5";
System.out.println(linkedMap.previousKey(key));
System.out.println(linkedMap.nextKey(key));
System.out.println(linkedMap.indexOf(key));
}
}
运行结果:
{key0=value0, key1=value1, key2=value2, key3=value3, key4=value4, key5=value5, key6=value6, key7=value7, key8=
value8, key9=value9}
key4
key6
5
MultiKeyMap
MultiKeyMap
实现了一个允许多个键的Map,允许将多个键关联到一个值上。
使用示例:
package com.gujin.collections;
import org.apache.commons.collections.map.MultiKeyMap;
import org.junit.Test;
public class MultiKeyMapTest
{
@Test
public void test()
{
MultiKeyMap multiKeyMap = new MultiKeyMap();
// 多个键对应一个值
multiKeyMap.put("name", "NAME", "jianggujin");
System.out.println(multiKeyMap);
System.out.println(multiKeyMap.get("name"));
System.out.println(multiKeyMap.get("NAME"));
System.out.println(multiKeyMap.get("name", "NAME"));
}
}
运行结果:
{MultiKey[name, NAME]=jianggujin}
null
null
jianggujin
MultiValueMap
MultiValueMap
允许一个键关联多个值。
使用示例:
package com.gujin.collections;
import java.util.ArrayList;
import org.apache.commons.collections.map.MultiValueMap;
import org.junit.Test;
public class MultiValueMapTest
{
@Test
public void test()
{
MultiValueMap multiValueMap = new MultiValueMap();
ArrayList<String> list = new ArrayList<String>();
list.add("value1");
list.add("value2");
list.add("value3");
list.add("value4");
multiValueMap.putAll("key", list);
System.out.println(multiValueMap);
System.out.println(multiValueMap.get("key"));
}
}
运行结果:
{key=[value1, value2, value3, value4]}
[value1, value2, value3, value4]
PredicatedMap
PredicatedMap
修饰另一个Map。在添加数据的时候进行校验。可参考上一篇博客中的PredicatedList用法。
ReferenceMap
ReferenceMap
使用软引用的方式维护数据,允许数据被垃圾收集器清理。
ReferenceIdentityMap
ReferenceIdentityMap
结合了IdentityMap
和ReferenceMap
,使用软引用维护数据并且使用==
匹配数据。
TransformedMap
TransformedMap
修饰另一个Map,在添加数据时,先对键和值进行转换。
TypedMap
TypedMap
修饰另一个Map,限定了键和值的数据类型。
UnmodifiableMap
UnmodifiableMap
修饰另一个Map,使其不允许被修改。