commons-collections使用介绍之Map

介绍完了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结合了IdentityMapReferenceMap,使用软引用维护数据并且使用==匹配数据。

TransformedMap

TransformedMap修饰另一个Map,在添加数据时,先对键和值进行转换。

TypedMap

TypedMap修饰另一个Map,限定了键和值的数据类型。

UnmodifiableMap

UnmodifiableMap修饰另一个Map,使其不允许被修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值