第五十九篇:commons-collections使用介绍之Map

xiaoxiao2021-02-28  97

介绍完了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")); } } 1234567891011121314151617 1234567891011121314151617

运行结果:

{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")); } } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

运行结果:

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")); } } 1234567891011121314151617 1234567891011121314151617

运行结果:

{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); } } 123456789101112131415161718192021 123456789101112131415161718192021

运行结果:

{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)); } } 12345678910111213141516171819 12345678910111213141516171819

运行结果:

{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")); } } 12345678910111213141516171819202122232425262728 12345678910111213141516171819202122232425262728

运行结果:

{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)); } } 12345678910111213141516171819202122 12345678910111213141516171819202122

运行结果:

{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")); } } 12345678910111213141516171819 12345678910111213141516171819

运行结果:

{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")); } } 1234567891011121314151617181920212223 1234567891011121314151617181920212223

运行结果:

{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,使其不允许被修改。

转载请注明原文地址: https://www.6miu.com/read-30324.html

最新回复(0)