`

guava之map

 
阅读更多
  先来看下传统方法建立map,list:

List<String> list = new ArrayList<String>();

Map<String, Integer> map = new HashMap<String, Integer>(); 

  有了guava,则可以简单了:

List<String> list = Lists.newArrayList(); 
Map<String, Integer> list = Maps.newHashMap(); 

  用到的是lists,maps的工具类
  可以这样:
List<Integer> list = Lists.newArrayList(1, 2, 3); 

1) 不可变list和map
   
不可变集合,顾名思义就是说集合是不可被修改的。集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变。

  为什么要用immutable对象?immutable对象有以下的优点:
    1.对不可靠的客户代码库来说,它使用安全,可以在未受信任的类库中安全的使用这些对象
    2.线程安全的:immutable对象在多线程下安全,没有竞态条件
    3.不需要支持可变性, 可以尽量节省空间和时间的开销. 所有的不可变集合实现都比可变集合更加有效的利用内存 (analysis)
    4.可以被使用为一个常量,并且期望在未来也是保持不变的

  immutable对象可以很自然地用作常量,因为它们天生就是不可变的对于immutable对象的运用来说,它是一个很好的防御编程(defensive programming)的技术实践。


   创建的方法简单:


ImmutableList<Integer> list = ImmutableList.of(1, 2, 3); 




Immutable集合使用方法:
  一个immutable集合可以有以下几种方式来创建:
  1.用copyOf方法, 譬如, ImmutableSet.copyOf(set)
  2.使用of方法,譬如,ImmutableSet.of("a", "b", "c")或者ImmutableMap.of("a", 1, "b", 2)
  3.使用Builder类

  实例:


@Test
    public void testGuavaImmutable(){
       
        List<String> list=new ArrayList<String>();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println("list:"+list);
       
        ImmutableList<String> imlist=ImmutableList.copyOf(list);
        System.out.println("imlist:"+imlist);
       
        ImmutableList<String> imOflist=ImmutableList.of("peida","jerry","harry");
        System.out.println("imOflist:"+imOflist);
       
        ImmutableSortedSet<String> imSortList=ImmutableSortedSet.of("a", "b", "c", "a", "d", "b");
        System.out.println("imSortList:"+imSortList);
       
         list.add("baby");
         System.out.println("list add a item after list:"+list);
         System.out.println("list add a item after imlist:"+imlist);
            
         ImmutableSet<Color> imColorSet =
               ImmutableSet.<Color>builder()
                   .add(new Color(0, 255, 255))
                   .add(new Color(0, 191, 255))
                   .build();
        
         System.out.println("imColorSet:"+imColorSet);      
    }

  输出:


list:[a, b, c]
imlist:[a, b, c]
imOflist:[peida, jerry, harry]
imSortList:[a, b, c, d]
list add a item after list:[a, b, c, baby]
list add a item after imlist:[a, b, c]
imColorSet:[java.awt.Color[r=0,g=255,b=255], java.awt.Color[r=0,g=191,b=255]]

2  SortedMap


@Test
public void whenUsingSortedMap_thenKeysAreSorted() {
    ImmutableSortedMap<String, Integer> salary = new ImmutableSortedMap
      .Builder<String, Integer>(Ordering.natural())
      .put("John", 1000)
      .put("Jane", 1500)
      .put("Adam", 2000)
      .put("Tom", 2000)
      .build();
 
    assertEquals("Adam", salary.firstKey());
    assertEquals(2000, salary.lastEntry().getValue().intValue());
}



3 BiMap
   就是MAP翻转了
   
@Test
public void whenCreateBiMap_thenCreated() {
    BiMap<String, Integer> words = HashBiMap.create();
    words.put("First", 1);
    words.put("Second", 2);
    words.put("Third", 3);
 
    assertEquals(2, words.get("Second").intValue());
    assertEquals("Third", words.inverse().get(3));
}



  

4 Multimap
   就是一个键多个值
  
@Test
public void whenCreateMultimap_thenCreated() {
    Multimap<String, String> multimap = ArrayListMultimap.create();
    multimap.put("fruit", "apple");
    multimap.put("fruit", "banana");
    multimap.put("pet", "cat");
    multimap.put("pet", "dog");
 
    assertThat(multimap.get("fruit"), containsInAnyOrder("apple", "banana"));
    assertThat(multimap.get("pet"), containsInAnyOrder("cat", "dog"));
}



5 TABLE
  
   当我们需要多个索引的数据结构的时候,通常情况下,我们只能用这种丑陋的Map<FirstName,  Map<LastName, Person>>来实现。为此Guava提供了一个新的集合类型-Table集合类型,来支持这种数据结构的使用场景。Table支持“row”和“column”,而且提供多种视图。
   

@Test
public void whenCreatingTable_thenCorrect() {
    Table<String,String,Integer> distance = HashBasedTable.create();
    distance.put("London", "Paris", 340);
    distance.put("New York", "Los Angeles", 3940);
    distance.put("London", "New York", 5576);
 
    assertEquals(3940, distance.get("New York", "Los Angeles").intValue());
    assertThat(distance.columnKeySet(), 
      containsInAnyOrder("Paris", "New York", "Los Angeles"));
    assertThat(distance.rowKeySet(), containsInAnyOrder("London", "New York"));
}




   说的简单点,table其实就是:
有行(Row)和列(Column),数据在一个格子(Cell)中。

Table可以是稀疏的。



   Table视图:
  rowMap()返回一个Map<R, Map<C, V>>的视图。rowKeySet()类似地返回一个Set<R>。
  row(r)返回一个非null的Map<C, V>。修改这个视图Map也会导致原表格的修改。
  和列相关的方法有columnMap(), columnKeySet()和column(c)。(基于列的操作会比基于行的操作效率差些)
  cellSet()返回的是以Table.Cell<R, C, V>为元素的Set。这里的Cell就类似Map.Entry,但是它是通过行和列来区分的。

  Table有以下实现:
  HashBasedTable:基于HashMap<R, HashMap<C, V>>的实现。
  TreeBasedTable:基于TreeMap<R, TreeMap<C, V>>的实现。
  ImmutableTable:基于ImmutableMap<R, ImmutableMap<C, V>>的实现。(注意,ImmutableTable已对稀疏和密集集合做了优化)
  ArrayTable:ArrayTable是一个需要在构建的时候就需要定下行列的表格。这种表格由二维数组实现,这样可以在密集数据的表格的场合,提高时间和空间的效率。



    其中对table很好的介绍见
http://davyjones2010.iteye.com/blog/2094017 一文
分享到:
评论

相关推荐

    guava-19.0 jar和sources

    此外,它还包含了对并发操作的支持,如ImmutableList、ImmutableSet、ImmutableMap等不可变集合,以及Future和 ListeningExecutorService等线程管理工具。 描述中提到的"guava-19.0-sources.jar"则是Guava库19.0...

    java集合分组(Guava)

    Java集合框架是编程中不可或缺的一部分,它提供了丰富的数据结构和操作接口,如List、Set、Map等。然而,有时候我们可能需要对集合数据进行更复杂的处理,比如分组,这时Guava库就显得非常有用。Guava是Google推出的...

    google开源项目guava.jar包

    Guava的集合框架扩展了Java内置的集合类,如List、Set和Map,提供了更强大的功能。例如,它包含Multiset(多集合)和Multimap(多映射)这样的数据结构,可以方便地处理多值关联的情况。Guava还引入了Immutable...

    guava-26.0-jre.zip

    1. **集合框架增强**:Guava提供了许多强大的集合类,如Multiset(多集)、Multimap(多映射)、ImmutableList、ImmutableSet和ImmutableMap等。这些集合在可变性、并发性和性能方面都进行了优化,能够更好地满足...

    guava-r07.zip

    Guava集合框架是其核心功能之一,提供了很多增强型的集合类,如Multiset(多频数集合)、Multimap(多值映射)、ImmutableList(不可变列表)、ImmutableSet(不可变集合)和ImmutableMap(不可变映射),这些集合在...

    guava-r09-jarjar.jar

    1. **集合框架**:Guava提供了许多扩展的集合类,如Multiset(多集)、Multimap(多映射)、ImmutableList、ImmutableSet和ImmutableMap等,它们提供了更强大的功能和更安全的实现。 2. **缓存**:Guava的Cache模块...

    guava 常用API说明

    通过以上对Guava常用API的介绍,我们可以看出Guava库的强大之处在于它为Java开发提供了许多实用工具和优化,帮助我们编写出更高效、更易于维护的代码。在实际开发中,合理利用Guava能显著提升代码质量,提高开发效率...

    guava-18.0资料

    1. **集合框架扩展**:Guava提供了丰富的集合类型,如Multiset(多集)、Multimap(多映射)和Table(表格),以及对Set、List和Map的高级实现,如ImmutableCollections(不可变集合)。这些集合可以更好地处理特定...

    mahout的guava-r09-jar

    1. **数据容器与集合**:Guava提供了强类型的List、Set和Map实现,以及Multiset、Multimap和Table等高级容器,使得数据组织和操作更加灵活和高效。 2. **缓存机制**:Guava的LoadingCache接口可以方便地创建自定义...

    guava 19.0开发文档

    - **ConcurrentMap**:线程安全的Map实现,如Guava的`Cache`就是基于它实现的。 - **Forwarding*和Decorating*类**:提供了一种装饰模式的抽象,可以方便地扩展已有集合类的功能。 8. **事件监听**: - **...

    Google-guava 19.0

    Guava对Java的集合框架进行了扩展,提供了如Multiset、Multimap、ImmutableList、ImmutableSet、ImmutableMap等不可变集合,以及BiMap(双向映射)和Table(二维表)等高级数据结构。这些集合类在保证线程安全的同时...

    guava-API文档

    1. 集合框架:Guava对Java的集合框架进行了扩展和优化,提供了如Multiset(多集)、Multimap(多映射)、ImmutableList(不可变列表)、ImmutableSet(不可变集)和ImmutableMap(不可变映射)等数据结构。...

    google guava

    Guava对Java集合框架进行了扩展,引入了如Multiset(多集)、Multimap(多映射)、ImmutableList、ImmutableSet和ImmutableMap(不可变集合)等高效、线程安全的集合类型。这些集合提供了更丰富的功能,例如...

    guava-cache.rar

    应用程序可以使用`CacheBuilder`的`recordStats`方法开启统计,`Cache`的`asMap()`视图可以用来获取统计信息,方便进行缓存分析和优化。 Guava Cache的这些特性和功能使得它成为Java开发中本地缓存的首选工具,...

    Getting start with guava

    ### Guava库入门指南 #### 一、简介与背景 Google Guava库是谷歌公司推出的一个开源项目,它为Java开发者提供了丰富的工具类和API,旨在帮助开发者编写更高效、简洁且可维护的代码。Guava库包含了大量实用功能,如...

    guava源码src

    1. **Guava集合框架**:Guava提供了许多强大的集合类,如Multiset、Multimap、ImmutableList、ImmutableSet和ImmutableMap等。这些集合类不仅在功能上超越了Java标准库,还在性能和线程安全性上有所优化。例如,...

    Google Guava 30.1.1常用类介绍及实践代码

    **Google Guava 30.1.1常用类介绍及实践代码** Google Guava 是一个由 Google 开发的 Java 库,它提供了许多基础工具,包括集合、缓存、原生类型支持、并发库、字符串处理、I/O 等等。在版本 30.1.1 中,Guava 继续...

    guava使用实例

    通过以上实例,我们可以看到Guava库的强大之处,它简化了许多常见的编程任务,提高了代码的可读性和效率。学习和掌握Guava,对于提升Java开发能力大有裨益。在实际开发中,可以根据需求选择合适的功能,灵活运用,以...

    jackson-datatype-guava-2.8.0.zip

    1. **Guava数据类型的支持**:此模块扩展了Jackson的核心功能,使其能够理解和处理Guava的特殊数据类型,如ImmutableList、ImmutableSet、ImmutableMap以及Optional等。这使得开发者可以方便地在JSON和Guava数据结构...

    google-guava-18.0

    Guava对Java的集合框架进行了扩展,提供了如Multiset、Multimap、ImmutableList、ImmutableSet、ImmutableMap等不可变集合,以及ListMultimap、SetMultimap和BiMap等特殊类型的映射结构。这些集合类提供了更多的...

Global site tag (gtag.js) - Google Analytics